difftreelog
Merge branch 'develop' into feature/create-collection-ex
in: master
15 files changed
Cargo.lockdiffbeforeafterboth382382383[[package]]383[[package]]384name = "autocfg"384name = "autocfg"385version = "1.0.1"385version = "1.1.0"386source = "registry+https://github.com/rust-lang/crates.io-index"386source = "registry+https://github.com/rust-lang/crates.io-index"387checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"387checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"388388389[[package]]389[[package]]390name = "backtrace"390name = "backtrace"634634635[[package]]635[[package]]636name = "block-buffer"636name = "block-buffer"637version = "0.10.1"637version = "0.10.2"638source = "registry+https://github.com/rust-lang/crates.io-index"638source = "registry+https://github.com/rust-lang/crates.io-index"639checksum = "03588e54c62ae6d763e2a80090d50353b785795361b4ff5b3bf0a5097fc31c0b"639checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324"640dependencies = [640dependencies = [641 "generic-array 0.14.5",641 "generic-array 0.14.5",642]642]109710971098[[package]]1098[[package]]1099name = "core-foundation"1099name = "core-foundation"1100version = "0.9.2"1100version = "0.9.3"1101source = "registry+https://github.com/rust-lang/crates.io-index"1101source = "registry+https://github.com/rust-lang/crates.io-index"1102checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3"1102checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"1103dependencies = [1103dependencies = [1104 "core-foundation-sys",1104 "core-foundation-sys",1105 "libc",1105 "libc",122912291230[[package]]1230[[package]]1231name = "crc32fast"1231name = "crc32fast"1232version = "1.3.1"1232version = "1.3.2"1233source = "registry+https://github.com/rust-lang/crates.io-index"1233source = "registry+https://github.com/rust-lang/crates.io-index"1234checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3"1234checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"1235dependencies = [1235dependencies = [1236 "cfg-if 1.0.0",1236 "cfg-if 1.0.0",1237]1237]128812881289[[package]]1289[[package]]1290name = "crypto-common"1290name = "crypto-common"1291version = "0.1.1"1291version = "0.1.2"1292source = "registry+https://github.com/rust-lang/crates.io-index"1292source = "registry+https://github.com/rust-lang/crates.io-index"1293checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0"1293checksum = "a4600d695eb3f6ce1cd44e6e291adceb2cc3ab12f20a33777ecd0bf6eba34e06"1294dependencies = [1294dependencies = [1295 "generic-array 0.14.5",1295 "generic-array 0.14.5",1296]1296]189818981899[[package]]1899[[package]]1900name = "digest"1900name = "digest"1901version = "0.10.1"1901version = "0.10.2"1902source = "registry+https://github.com/rust-lang/crates.io-index"1902source = "registry+https://github.com/rust-lang/crates.io-index"1903checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b"1903checksum = "8cb780dce4f9a8f5c087362b3a4595936b2019e7c8b30f2c3e9a7e94e6ae9837"1904dependencies = [1904dependencies = [1905 "block-buffer 0.10.1",1905 "block-buffer 0.10.2",1906 "crypto-common",1906 "crypto-common",1907 "generic-array 0.14.5",1908]1907]190919081910[[package]]1909[[package]]324132403242[[package]]3241[[package]]3243name = "httparse"3242name = "httparse"3244version = "1.5.1"3243version = "1.6.0"3245source = "registry+https://github.com/rust-lang/crates.io-index"3244source = "registry+https://github.com/rust-lang/crates.io-index"3246checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503"3245checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4"324732463248[[package]]3247[[package]]3249name = "httpdate"3248name = "httpdate"466446634665[[package]]4664[[package]]4666name = "memmap2"4665name = "memmap2"4667version = "0.5.2"4666version = "0.5.3"4668source = "registry+https://github.com/rust-lang/crates.io-index"4667source = "registry+https://github.com/rust-lang/crates.io-index"4669checksum = "fe3179b85e1fd8b14447cbebadb75e45a1002f541b925f0bfec366d56a81c56d"4668checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f"4670dependencies = [4669dependencies = [4671 "libc",4670 "libc",4672]4671]8805source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.16#4aeb95f7f38fcd519e2628f32f79044a8fef99d5"8804source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.16#4aeb95f7f38fcd519e2628f32f79044a8fef99d5"8806dependencies = [8805dependencies = [8807 "impl-trait-for-tuples",8806 "impl-trait-for-tuples",8808 "memmap2 0.5.2",8807 "memmap2 0.5.3",8809 "parity-scale-codec",8808 "parity-scale-codec",8810 "sc-chain-spec-derive",8809 "sc-chain-spec-derive",8811 "sc-network",8810 "sc-network",9912dependencies = [9911dependencies = [9913 "cfg-if 1.0.0",9912 "cfg-if 1.0.0",9914 "cpufeatures 0.2.1",9913 "cpufeatures 0.2.1",9915 "digest 0.10.1",9914 "digest 0.10.2",9916]9915]991799169918[[package]]9917[[package]]116441164311645[[package]]11644[[package]]11646name = "unique-node"11645name = "unique-node"11647version = "0.9.14"11646version = "0.9.16"11648dependencies = [11647dependencies = [11649 "cumulus-client-cli",11648 "cumulus-client-cli",11650 "cumulus-client-collator",11649 "cumulus-client-collator",Dockerfile-parachaindiffbeforeafterboth90 nvm install v15.5.0 && \90 nvm install v15.5.0 && \91 nvm use v15.5.091 nvm use v15.5.0929293RUN git clone https://github.com/PureStake/polkadot-launch -b jlm-use-para-id-in-specs93RUN git clone https://github.com/paritytech/polkadot-launch949495RUN export NVM_DIR="$HOME/.nvm" && \95RUN export NVM_DIR="$HOME/.nvm" && \96 [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \96 [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \README.mddiffbeforeafterboth292930Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!30Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!313132## Hackusama Update3334During the Kusama Hackaphon the following changes were made:3536- Enabled Smart Contracts Pallet37- Enabled integration between Smart Contracts and Unique Pallet (required special edition of RC4 Substrate version)38- Fixed misc. bugs in Unique Pallet39- Deployed Unique TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.40- New Features:41 - Re-Fungible Token Mode42 - Off-Chain Schema to store token image URLs43 - Alternative economic model44 - Allow Lists and Public Mint Permission45- Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and Unique Testnet46 Blockchain.4748## Application Development32## Application Development493350If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).34If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).51353652## Building37## Building533854Building Unique chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything39Building Unique chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything571. Install Rust:421. Install Rust:584359```bash44```bash45sudo apt-get install git curl libssl-dev llvm pkg-config libclang-dev clang60curl https://sh.rustup.rs -sSf | sh46curl https://sh.rustup.rs -sSf | sh61sudo apt-get install libssl-dev pkg-config libclang-dev clang62```47```6348642. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.492. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.86cargo build --release71cargo build --release87```72```887389## Run74## Building as Parachain locally907591You can start a development chain with:76Note: checkout this project and all related projects (see below) in the sibling folders (both under the same folder)927793```bash94cargo run -- --dev78### Polkadot launch utility95```967997Detailed logs may be shown by running the node with the following environment variables set:98`RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.99100If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two101validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with102testnet units. Give each node a name and expose them so they are listed on the Polkadot103[telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open.104105We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at106`/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from107the `--node-key` value that we specify below:108109```bash110cargo run -- \111 --base-path /tmp/alice \112 --chain=local \113 --alice \114 --node-key 0000000000000000000000000000000000000000000000000000000000000001 \115 --telemetry-url ws://telemetry.polkadot.io:1024 \116 --validator117```80```118119In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database81git clone https://github.com/paritytech/polkadot-launch120stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's121bootnode ID on TCP port 30333:122123```bash124cargo run -- \125 --base-path /tmp/bob \126 --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \127 --chain=local \128 --bob \129 --port 30334 \130 --telemetry-url ws://telemetry.polkadot.io:1024 \131 --validator132```82```13383134Additional CLI usage options are available and may be shown by running `cargo run -- --help`.135136## Building and Running as Parachain locally137138Rust toolchain: nightly-2021-11-11139Note: checkout this project and polkadot project (see below) in the sibling folders (both under the same folder)140141### Build relay84### Build relay14285143```86```144git clone https://github.com/paritytech/polkadot.git87git clone https://github.com/paritytech/polkadot.git145cd polkadot88cd polkadot146git checkout release-v0.9.989git checkout release-v0.9.16147cargo build --release90cargo build --release148```91```14992150### Build parachain93### Build Unique parachain15194152Run in the root of this project:95Run in the root of this project:153```96```154cargo --build97cargo build --release155```98```15699157### Run 4-node Relay100### Build Acala parachain (optional, full config only)1581011591. Download `rococo-custom-4.json` chain spec here: https://substrate.dev/cumulus-workshop/shared/chainspecs/rococo-custom-4.json1602. Use these instructions to launch 4 nodes: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/1-launch161162Example (Run in polkadot folder. Replace `12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on` with output from Alice node):163```102```164./target/release/polkadot --alice --validator --base-path ./cumulus_relay0 --chain rococo-custom-4.json --port 50555 --ws-port 9944103git clone https://github.com/AcalaNetwork/Acala165./target/release/polkadot --bob --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50556 --ws-port 9945104cd Acala166./target/release/polkadot --charlie --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50557 --ws-port 9946105git checkout 54db3acd409a0b787f116f20e163a3b24101ce38167./target/release/polkadot --dave --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50558 --ws-port 9947106make build-release168169```107```1701081713. Export genesis state and runtime wasm from Unique parachain:109## Running as Parachain locally172110173Run from this project root:174```111```175./target/release/unique-collator export-genesis-state --parachain-id 2000 > ./resources/para-2000-genesis112./launch-testnet.sh176./target/release/unique-collator export-genesis-wasm > ./resources/para-2000-wasm177```113```1781141794. Run two parachain nodes:115Optional, full setup with Acala and Statemint180181Replace `12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg` with Alice or Bob relay ID182183Run from this project root:184```116```185./target/release/unique-collator --alice --collator --force-authoring --base-path ./tmp/parachain-alice --parachain-id 2000 --port 40333 --ws-port 9844 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30343 --ws-port 9977117./launch-testnet-full.sh186./target/release/unique-collator --bob --collator --force-authoring --parachain-id 2000 --base-path ./tmp/parachain/bob --port 40334 --ws-port 9845 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30344 --ws-port 9978 --bootnodes /ip4/127.0.0.1/tcp/50556/p2p/12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg187```118```1881191894. Reserve parachain ID as described here: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/2-reserve1901915. Register parachain in relay as described here: https://substrate.dev/cumulus-workshop/#/en/3-parachains/2-register192193194## Run Integration Tests120## Run Integration Tests1951211961. Install all needed dependecies1221. Install all needed dependecies204yarn test130yarn test205```131```206132207## Benchmarks208133209First of all, add rust toolchain and make it default.210```bash211rustup target add wasm32-unknown-unknown --toolchain nightly-2021-11-11212```213214Then in "/node/src" run build command below215```bash216cargo +nightly-2021-11-11 build --release --features runtime-benchmarks217```218219Run benchmark220```bash221target/release/unique-collator benchmark --chain dev --pallet "pallet_unique" --extrinsic "*" --repeat 1222```223224## UI custom types225226Moved to [runtime_types.json](./runtime_types.json).227228## Running Integration Tests229230See [tests/README.md](./tests/README.md).231232## Code Formatting134## Code Formatting233135234### Get formatter and linter settings into your branch (if you forked before they were introduced)235```bash236git cherry-pick -n 8ff77c21b0d30b2a4648fa35dbf61dfa9d3948a7237```238239### Apply formatting and clippy fixes136### Apply formatting and clippy fixes240```bash137```bash241cargo clippy138cargo clippy252cd tests && yarn eslint --ext .ts,.js src/149cd tests && yarn eslint --ext .ts,.js src/253```150```254151255## Re-Enabling Ink! Contracts256152257Uncomment following lies:2581. In node/rpc/Cargo.toml259```260# pallet-contracts-rpc = { version = "3.0", git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.9' }153## Karura token transfer261```2621542632. In node/rpc/src/lib.rs155To get started, you need to open inbound and outbound hrmp channels.264```265// C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber, Hash>,266...267// use pallet_contracts_rpc::{Contracts, ContractsApi};268...269// io.extend_with(ContractsApi::to_delegate(Contracts::new(client.clone())));270156157### Next, we need to register our asset at Karura.271```158```159assetRegistry -> registerForeignAsset(location, metadata)160location:161 V0(X2(Parent, Parachain(PARA_ID))) 162metadata:163 name OPL164 symbol OPL165 decimals 18166minimalBalance 1167```2721682733. In runtime/Cargo.toml169### Next, we can send tokens from Opal to Karura:274```170```275 # 'pallet-contracts/std',171polkadotXcm -> reserveTransferAssets276 # 'pallet-contracts-primitives/std',172dest:277 # 'pallet-contracts-rpc-runtime-api/std',278 # 'pallet-contract-helpers/std',173 V0(X2(Parent, Parachain(<KARURA_PARA_ID>))) 279...174beneficiary:280 # [dependencies.pallet-contracts]175 X1(AccountId(Any, <ACCOUNT>))281 # git = 'https://github.com/paritytech/substrate.git'176assets:282 # default-features = false177 V1(Concrete(0,Here), Fungible(<AMOUNT>))283 # branch = 'polkadot-v0.9.9'178feeAssetItem: 284 # version = '3.0.0'179 0 180weightLimit:181 <LIMIT>182``` 285183286 # [dependencies.pallet-contracts-primitives]184The result will be displayed in ChainState 287 # git = 'https://github.com/paritytech/substrate.git'288 # default-features = false185tokens -> accounts 289 # branch = 'polkadot-v0.9.9'290 # version = '3.0.0'291186292 # [dependencies.pallet-contracts-rpc-runtime-api]187### To send tokens from Karura to Opal:293 # git = 'https://github.com/paritytech/substrate.git'294 # default-features = false295 # branch = 'polkadot-v0.9.9'296 # version = '3.0.0'297...298 # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' }299```188```189xtokens -> transfer3001903014. runtime/src/lib.rs302```303// use pallet_contracts::weights::WeightInfo;191currencyId:304...305// pub use pallet_timestamp::Call as TimestampCall;306...307// mod chain_extension;308// use crate::chain_extension::{NFTExtension, Imbalance};309...310/*311parameter_types! {312 pub TombstoneDeposit: Balance = deposit(192 ForeingAsset313 ...314}315*/316...317//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,318...319// impl pallet_contract_helpers::Config for Runtime {}320...321// Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>},322...323// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage},324...325//pallet_contract_helpers::ContractHelpersExtension<Runtime>,326...327/*328 impl pallet_contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber, Hash>193 <TOKEN_ID>329 for Runtime330 {331 ...332 }333*/334194195amount:196 <AMOUNT>197dest:198 V1199 (200 Parents:1, 201 X2(Parachain(<KARURA_PARA_ID>), AccountId(Any, <ACCOUNT>)202 )203destWeight:204 <WEIGHT>335```205```336doc/hackusama_update.mddiffbeforeafterbothno changes
doc/re-enable_ink_contracts.mddiffbeforeafterbothno changes
launch-config-full.jsondiffbeforeafterbothno changes
launch-config-westend.jsondiffbeforeafterbothno changes
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 {38 "flags": [40 "flags": [39 "-lparachain::candidate_validation=debug"41 "-lparachain::candidate_validation=debug"40 ]42 ]41 }43 },44 {45 "name": "eve",46 "wsPort": 9888,47 "rpcPort": 9887,48 "port": 30888,49 "flags": [50 "-lparachain::candidate_validation=debug"51 ]52 }42 ],53 ],43 "genesis": {54 "genesis": {44 "runtime": {55 "runtime": {67 "flags": [78 "flags": [68 "--rpc-cors=all",79 "--rpc-cors=all",69 "--unsafe-rpc-external",80 "--unsafe-rpc-external",70 "--unsafe-ws-external"81 "--unsafe-ws-external",82 "-lxcm=trace"71 ]83 ]72 },84 },73 {85 {78 "flags": [90 "flags": [79 "--rpc-cors=all",91 "--rpc-cors=all",80 "--unsafe-rpc-external",92 "--unsafe-rpc-external",81 "--unsafe-ws-external"93 "--unsafe-ws-external",94 "-lxcm=trace"82 ]95 ]83 }96 }84 ]97 ]launch-test-env.shdiffbeforeafterbothno changes
launch-testnet-full.shdiffbeforeafterbothno changes
launch-testnet.shdiffbeforeafterbothno changes
node/cli/Cargo.tomldiffbeforeafterboth257license = 'All Rights Reserved'257license = 'All Rights Reserved'258name = 'unique-node'258name = 'unique-node'259repository = 'https://github.com/UniqueNetwork/unique-chain'259repository = 'https://github.com/UniqueNetwork/unique-chain'260version = '0.9.14'260version = '0.9.16'261261262[[bin]]262[[bin]]263name = 'unique-collator'263name = 'unique-collator'runtime/src/lib.rsdiffbeforeafterboth24 Permill, Perbill, Percent, create_runtime_str, generic, impl_opaque_keys,24 Permill, Perbill, Percent, create_runtime_str, generic, impl_opaque_keys,25 traits::{25 traits::{26 AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify, AccountIdConversion,26 AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify,27 AccountIdConversion, Zero,27 },28 },28 transaction_validity::{TransactionSource, TransactionValidity},29 transaction_validity::{TransactionSource, TransactionValidity},29 ApplyExtrinsicResult, MultiSignature, RuntimeAppPublic,30 ApplyExtrinsicResult, MultiSignature, RuntimeAppPublic,45 dispatch::DispatchResult,46 dispatch::DispatchResult,46 PalletId, parameter_types, StorageValue, ConsensusEngineId,47 PalletId, parameter_types, StorageValue, ConsensusEngineId,47 traits::{48 traits::{48 Everything, Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem,49 tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Everything,49 LockIdentifier, OnUnbalanced, Randomness, FindAuthor,50 Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,51 OnUnbalanced, Randomness, FindAuthor,50 },52 },69use pallet_evm::{Account as EVMAccount, FeeCalculator, GasWeightMapping, OnMethodCall};71use pallet_evm::{Account as EVMAccount, FeeCalculator, GasWeightMapping, OnMethodCall};70use fp_rpc::TransactionStatus;72use fp_rpc::TransactionStatus;71use sp_runtime::{73use sp_runtime::{72 traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf},74 traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf, Saturating},73 transaction_validity::TransactionValidityError,75 transaction_validity::TransactionValidityError,76 SaturatedConversion,74};77};757876// pub use pallet_timestamp::Call as TimestampCall;79// pub use pallet_timestamp::Call as TimestampCall;82use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};85use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};83use xcm_builder::{86use xcm_builder::{84 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,87 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,85 EnsureXcmOrigin, FixedWeightBounds, IsConcrete, LocationInverter, NativeAsset,88 EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset, ParentAsSuperuser,86 ParentAsSuperuser, ParentIsDefault, RelayChainAsNative, SiblingParachainAsNative,89 ParentIsDefault, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,87 SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,90 SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,88 SovereignSignedViaLocation, TakeWeightCredit, UsingComponents,89};91};90use xcm_executor::{Config, XcmExecutor};92use xcm_executor::{Config, XcmExecutor, Assets};93use sp_std::{marker::PhantomData};9495use xcm::latest::{96 // Xcm,97 AssetId::{Concrete},98 Fungibility::Fungible as XcmFungible,99 MultiAsset,100 Error as XcmError,101};102use xcm_executor::traits::{MatchesFungible, WeightTrader};103//use xcm_executor::traits::MatchesFungible;104use sp_runtime::traits::CheckedConversion;9110592// mod chain_extension;106// mod chain_extension;93// use crate::chain_extension::{NFTExtension, Imbalance};107// use crate::chain_extension::{NFTExtension, Imbalance};146 spec_name: create_runtime_str!("opal"),160 spec_name: create_runtime_str!("opal"),147 impl_name: create_runtime_str!("opal"),161 impl_name: create_runtime_str!("opal"),148 authoring_version: 1,162 authoring_version: 1,149 spec_version: 914000,163 spec_version: 916001,150 impl_version: 1,164 impl_version: 0,151 apis: RUNTIME_API_VERSIONS,165 apis: RUNTIME_API_VERSIONS,152 transaction_version: 0,166 transaction_version: 1,153 state_version: 0,167 state_version: 0,154};168};155169616 AccountId32Aliases<RelayNetwork, AccountId>,630 AccountId32Aliases<RelayNetwork, AccountId>,617);631);632633pub struct OnlySelfCurrency;634impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {635 fn matches_fungible(a: &MultiAsset) -> Option<B> {636 match (&a.id, &a.fun) {637 (Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),638 _ => None,639 }640 }641}618642619/// Means for transacting assets on this chain.643/// Means for transacting assets on this chain.620pub type LocalAssetTransactor = CurrencyAdapter<644pub type LocalAssetTransactor = CurrencyAdapter<621 // Use this currency:645 // Use this currency:622 Balances,646 Balances,623 // Use this currency when it is a fungible asset matching the given location or name:647 // Use this currency when it is a fungible asset matching the given location or name:624 IsConcrete<RelayLocation>,648 OnlySelfCurrency,625 // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:649 // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:626 LocationToAccountId,650 LocationToAccountId,627 // Our chain's account ID type (we can't get away without mentioning it explicitly):651 // Our chain's account ID type (we can't get away without mentioning it explicitly):677 // ^^^ Parent & its unit plurality gets free execution701 // ^^^ Parent & its unit plurality gets free execution678);702);703704pub struct UsingOnlySelfCurrencyComponents<705 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,706 AssetId: Get<MultiLocation>,707 AccountId,708 Currency: CurrencyT<AccountId>,709 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,710>(711 Weight,712 Currency::Balance,713 PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,714);715impl<716 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,717 AssetId: Get<MultiLocation>,718 AccountId,719 Currency: CurrencyT<AccountId>,720 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,721 > WeightTrader722 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>723{724 fn new() -> Self {725 Self(0, Zero::zero(), PhantomData)726 }727728 fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {729 let amount = WeightToFee::calc(&weight);730 let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;731732 // location to this parachain through relay chain733 let option1: xcm::v1::AssetId = Concrete(MultiLocation {734 parents: 1,735 interior: X1(Parachain(ParachainInfo::parachain_id().into())),736 });737 // direct location738 let option2: xcm::v1::AssetId = Concrete(MultiLocation {739 parents: 0,740 interior: Here,741 });742743 let required = if payment.fungible.contains_key(&option1) {744 (option1, u128_amount).into()745 } else if payment.fungible.contains_key(&option2) {746 (option2, u128_amount).into()747 } else {748 (Concrete(MultiLocation::default()), u128_amount).into()749 };750751 let unused = payment752 .checked_sub(required)753 .map_err(|_| XcmError::TooExpensive)?;754 self.0 = self.0.saturating_add(weight);755 self.1 = self.1.saturating_add(amount);756 Ok(unused)757 }758759 fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {760 let weight = weight.min(self.0);761 let amount = WeightToFee::calc(&weight);762 self.0 -= weight;763 self.1 = self.1.saturating_sub(amount);764 let amount: u128 = amount.saturated_into();765 if amount > 0 {766 Some((AssetId::get(), amount).into())767 } else {768 None769 }770 }771}772impl<773 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,774 AssetId: Get<MultiLocation>,775 AccountId,776 Currency: CurrencyT<AccountId>,777 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,778 > Drop779 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>780{781 fn drop(&mut self) {782 OnUnbalanced::on_unbalanced(Currency::issue(self.1));783 }784}679785680pub struct XcmConfig;786pub struct XcmConfig;681impl Config for XcmConfig {787impl Config for XcmConfig {689 type LocationInverter = LocationInverter<Ancestry>;795 type LocationInverter = LocationInverter<Ancestry>;690 type Barrier = Barrier;796 type Barrier = Barrier;691 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;797 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;692 type Trader = UsingComponents<IdentityFee<Balance>, RelayLocation, AccountId, Balances, ()>;798 type Trader = UsingOnlySelfCurrencyComponents<799 IdentityFee<Balance>,800 RelayLocation,801 AccountId,802 Balances,803 (),804 >;693 type ResponseHandler = (); // Don't handle responses for now.805 type ResponseHandler = (); // Don't handle responses for now.694 type SubscriptionService = PolkadotXcm;806 type SubscriptionService = PolkadotXcm;tests/package.jsondiffbeforeafterboth64 "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",64 "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",65 "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",65 "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",66 "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",66 "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",67 "testXcmTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/xcmTransfer.test.ts",67 "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",68 "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",68 "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",69 "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",69 "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts",70 "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts",tests/src/xcmTransfer.test.tsdiffbeforeafterbothno changes