git.delta.rocks / unique-network / refs/commits / 253e15bbcbb5

difftreelog

feat(xcm-tests) sending is ready, receiving pending core functionality

Fahrrader2022-01-21parent: #1c8c05f.patch.diff
in: master

3 files changed

modifiedlaunch-config.jsondiffbeforeafterboth
before · launch-config.json
1{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}
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -64,6 +64,7 @@
     "testOverflow": "mocha --timeout 9999999 -r ts-node/register ./**/overflow.test.ts",
     "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",
     "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",
+    "testXcmTransfer": "mocha --timeout 9999999 -r ts-node/register ./**/xcmTransfer.test.ts",
     "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",
     "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",
     "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts",
addedtests/src/xcmTransfer.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/xcmTransfer.test.ts
@@ -0,0 +1,200 @@
+//
+// This file is subject to the terms and conditions defined in
+// file 'LICENSE', which is part of this source code package.
+//
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+
+import {WsProvider} from '@polkadot/api';
+import {ApiOptions} from '@polkadot/api/types';
+import {IKeyringPair} from '@polkadot/types/types';
+import privateKey from './substrate/privateKey';
+import usingApi, {submitTransactionAsync} from './substrate/substrate-api';
+import {getGenericResult} from './util/helpers';
+import waitNewBlocks from './substrate/wait-new-blocks';
+import getBalance from './substrate/get-balance';
+import {alicesPublicKey} from './accounts';
+
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+const UNIQUE_CHAIN = 1000;
+const KARURA_CHAIN = 2000;
+const KARURA_PORT = '9946';
+
+describe('Integration test: Exchanging QTZ/OPL with Karura', () => {
+  let alice: IKeyringPair;
+  
+  before(async () => {
+    await usingApi(async () => {
+      alice = privateKey('//Alice');
+    });
+
+    const karuraApiOptions: ApiOptions = {
+      provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT),
+    };
+
+    await usingApi(async (api) => {
+      const destination = {
+        V0: {
+          X2: [
+            'Parent',
+            {
+              Parachain: UNIQUE_CHAIN,
+            },
+          ],
+        },
+      };
+
+      const metadata =
+      {
+        name: 'OPL',
+        symbol: 'OPL',
+        decimals: 15,
+        minimalBalance: 1,
+      };
+
+      const tx = api.tx.assetRegistry.registerForeignAsset(destination, metadata);
+      const sudoTx = api.tx.sudo.sudo(tx as any);
+      const events = await submitTransactionAsync(alice, sudoTx);
+      const result = getGenericResult(events);
+      expect(result.success).to.be.true;
+    }, karuraApiOptions);
+  });
+
+  it('Should connect and send OPL to Karura', async () => {
+    let balanceOnKaruraBefore: bigint;
+    
+    await usingApi(async (api) => {
+      const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;
+      balanceOnKaruraBefore = free;
+    }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});
+
+    await usingApi(async (api) => {
+      const destination = {
+        V0: {
+          X2: [
+            'Parent',
+            {
+              Parachain: KARURA_CHAIN,
+            },
+          ],
+        },
+      };
+
+      const beneficiary = {
+        V0: {
+          X1: {
+            AccountId32: {
+              network: 'Any',
+              id: alice.addressRaw,
+            },
+          },
+        },
+      };
+
+      const assets = {
+        V1: [
+          {
+            id: {
+              Concrete: {
+                parents: 0,
+                interior: 'Here',
+              },
+            },
+            fun: {
+              Fungible: 5000000000,
+            },
+          },
+        ],
+      };
+
+      const feeAssetItem = 0;
+
+      const weightLimit = {
+        Limited: 5000000000,
+      };
+
+      const tx = api.tx.polkadotXcm.limitedReserveTransferAssets(destination, beneficiary, assets, feeAssetItem, weightLimit);
+      const events = await submitTransactionAsync(alice, tx);
+      const result = getGenericResult(events);
+      expect(result.success).to.be.true;
+    });
+
+    await usingApi(async (api) => {
+      // todo do something about instant sealing, where there might not be any new blocks
+      await waitNewBlocks(api, 1);
+      const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;
+      expect(free > balanceOnKaruraBefore).to.be.true;
+    }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});
+  });
+
+  /// TODO Under construction. The test won't pass.
+  it.skip('Should connect to Karura and send OPL back', async () => {
+    let balanceBefore: bigint;
+    
+    await usingApi(async (api) => {
+      [balanceBefore] = await getBalance(api, [alicesPublicKey]);
+    });
+
+    await usingApi(async (api) => {
+      const destination = {
+        V0: {
+          X2: [
+            'Parent',
+            {
+              Parachain: UNIQUE_CHAIN,
+            },
+          ],
+        },
+      };
+
+      const beneficiary = {
+        V0: {
+          X1: {
+            AccountId32: {
+              network: 'Any',
+              id: alice.addressRaw,
+            },
+          },
+        },
+      };
+
+      const assets = {
+        V1: [
+          {
+            id: {
+              Concrete: {
+                parents: 0,
+                interior: 'Here',
+              },
+            },
+            fun: {
+              Fungible: 5000000000,
+            },
+          },
+        ],
+      };
+
+      const feeAssetItem = 0;
+
+      const weightLimit = {
+        Limited: 5000000000,
+      };
+
+      // todo The functionality to be tested is not complete yet. The metadata above are subject to change, as is the transaction below.
+      const tx = api.tx.polkadotXcm.limitedReserveTransferAssets(destination, beneficiary, assets, feeAssetItem, weightLimit);
+      const events = await submitTransactionAsync(alice, tx);
+      const result = getGenericResult(events);
+      expect(result.success).to.be.true;
+    }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});
+
+    await usingApi(async (api) => {
+      // todo do something about instant sealing, where there might not be any new blocks
+      await waitNewBlocks(api, 1);
+      const [balanceAfter] = await getBalance(api, [alicesPublicKey]);
+      expect(balanceAfter > balanceBefore).to.be.true;
+    });
+  });
+});
\ No newline at end of file