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.jsondiffbeforeafterboth9 "rpcPort": 9843,9 "rpcPort": 9843,10 "port": 30444,10 "port": 30444,11 "flags": [11 "flags": [12 "-lparachain::candidate_validation=debug"12 "-lparachain::candidate_validation=debug",13 "-lxcm=trace"13 ]14 ]14 },15 },15 {16 {18 "rpcPort": 9854,19 "rpcPort": 9854,19 "port": 30555,20 "port": 30555,20 "flags": [21 "flags": [21 "-lparachain::candidate_validation=debug"22 "-lparachain::candidate_validation=debug",23 "-lxcm=trace"22 ]24 ]23 },25 },24 {26 {67 "flags": [69 "flags": [68 "--rpc-cors=all",70 "--rpc-cors=all",69 "--unsafe-rpc-external",71 "--unsafe-rpc-external",70 "--unsafe-ws-external"72 "--unsafe-ws-external",73 "-lxcm=trace"71 ]74 ]72 },75 },73 {76 {78 "flags": [81 "flags": [79 "--rpc-cors=all",82 "--rpc-cors=all",80 "--unsafe-rpc-external",83 "--unsafe-rpc-external",81 "--unsafe-ws-external"84 "--unsafe-ws-external",85 "-lxcm=trace"82 ]86 ]83 }87 }84 ]88 ]85 }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 }86 ],109 ],87 "simpleParachains": [],110 "simpleParachains": [],88 "hrmpChannels": [],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 ],89 "finalization": false125 "finalization": false90}126}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):