difftreelog
Karura
in: master
3 files changed
README.mddiffbeforeafterboth--- a/README.md
+++ b/README.md
@@ -333,3 +333,35 @@
*/
```
+
+
+## Karura token transfer
+
+To get started, you need to open the hrmr channel.
+Next, we need to register our asset in Karura.
+
+assetRegistry -> registerForeignAsset(location, metadata)
+location:
+ V0(X2(Parent, Parachain(PARA_ID)))
+metadata:
+ name OPL
+ symbol OPL
+ decimals 15
+minimalBalance 1
+
+Next, we can send tokens of our chain:
+polkadotXcm -> reserveTransferAssets
+dest:
+ V0(X2(Parent, Parachain(KARURA_PARA_ID)))
+beneficiary:
+ X1(AccountId(Any, ACCOUNT))
+assets:
+ V1(Concrete(0,Here), Fungible(AMOUNT))
+feeAssetItem:
+ 0
+weightLimit:
+ Limit
+
+
+The result will be displayed in ChainState
+tokens -> accounts
launch-config.jsondiffbeforeafterboth1{2 "relaychain": {3 "bin": "../polkadot/target/release/polkadot",4 "chain": "rococo-local",5 "nodes": [6 {7 "name": "alice",8 "wsPort": 9844,9 "rpcPort": 9843,10 "port": 30444,11 "flags": [12 "-lparachain::candidate_validation=debug",13 "-lxcm=trace"14 ]15 },16 {17 "name": "bob",18 "wsPort": 9855,19 "rpcPort": 9854,20 "port": 30555,21 "flags": [22 "-lparachain::candidate_validation=debug",23 "-lxcm=trace"24 ]25 },26 {27 "name": "charlie",28 "wsPort": 9866,29 "rpcPort": 9865,30 "port": 30666,31 "flags": [32 "-lparachain::candidate_validation=debug"33 ]34 },35 {36 "name": "dave",37 "wsPort": 9877,38 "rpcPort": 9876,39 "port": 30777,40 "flags": [41 "-lparachain::candidate_validation=debug"42 ]43 }44 ],45 "genesis": {46 "runtime": {47 "runtime_genesis_config": {48 "parachainsConfiguration": {49 "config": {50 "validation_upgrade_frequency": 1,51 "validation_upgrade_delay": 152 }53 }54 }55 }56 }57 },58 "parachains": [59 {60 "bin": "../unique-chain/target/release/unique-collator",61 "id": "1000",62 "balance": "1000000000000000000000000",63 "nodes": [64 {65 "port": 31200,66 "wsPort": 9944,67 "rpcPort": 9933,68 "name": "alice",69 "flags": [70 "--rpc-cors=all",71 "--unsafe-rpc-external",72 "--unsafe-ws-external",73 "-lxcm=trace"74 ]75 },76 {77 "port": 31201,78 "wsPort": 9945,79 "rpcPort": 9934,80 "name": "bob",81 "flags": [82 "--rpc-cors=all",83 "--unsafe-rpc-external",84 "--unsafe-ws-external",85 "-lxcm=trace"86 ]87 }88 ]89 },90 {91 "bin": "../Acala/target/release/acala",92 "id": "2000",93 "chain": "karura-dev",94 "balance": "1000000000000000000000",95 "nodes": [96 {97 "wsPort": 9988,98 "port": 31200,99 "name": "alice",100 "flags": [101 "--rpc-cors=all",102 "--unsafe-rpc-external",103 "--unsafe-ws-external",104 "-lxcm=trace"105 ]106 }107 ]108 }109 ],110 "simpleParachains": [],111 "hrmpChannels": [112 {113 "sender": 2000,114 "recipient": 1000,115 "maxCapacity": 8,116 "maxMessageSize": 512117 },118 {119 "sender": 1000,120 "recipient": 2000,121 "maxCapacity": 8,122 "maxMessageSize": 512123 }124 ],125 "finalization": false126}runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -82,13 +82,22 @@
use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};
use xcm_builder::{
AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,
- EnsureXcmOrigin, FixedWeightBounds, IsConcrete, LocationInverter, NativeAsset,
+ EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset,
ParentAsSuperuser, ParentIsDefault, RelayChainAsNative, SiblingParachainAsNative,
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
SovereignSignedViaLocation, TakeWeightCredit, UsingComponents,
};
use xcm_executor::{Config, XcmExecutor};
+use xcm::latest::{
+// Xcm,
+ AssetId::{Concrete},
+ Fungibility::Fungible as XcmFungible,
+ MultiAsset
+};
+use xcm_executor::traits::MatchesFungible;
+use sp_runtime::traits::CheckedConversion;
+
// mod chain_extension;
// use crate::chain_extension::{NFTExtension, Imbalance};
@@ -616,12 +625,24 @@
AccountId32Aliases<RelayNetwork, AccountId>,
);
+
+pub struct OnlySelfCurrency;
+impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {
+ fn matches_fungible(a: &MultiAsset) -> Option<B> {
+ match (&a.id, &a.fun) {
+ (Concrete(_), XcmFungible(ref amount)) =>
+ CheckedConversion::checked_from(*amount),
+ _ => None,
+ }
+ }
+}
+
/// Means for transacting assets on this chain.
pub type LocalAssetTransactor = CurrencyAdapter<
// Use this currency:
Balances,
// Use this currency when it is a fungible asset matching the given location or name:
- IsConcrete<RelayLocation>,
+ OnlySelfCurrency,
// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:
LocationToAccountId,
// Our chain's account ID type (we can't get away without mentioning it explicitly):