1234567891011121314151617import chai from 'chai';18import chaiAsPromised from 'chai-as-promised';1920import {WsProvider} from '@polkadot/api';21import {ApiOptions} from '@polkadot/api/types';22import {IKeyringPair} from '@polkadot/types/types';23import usingApi, {submitTransactionAsync} from './substrate/substrate-api';24import {getGenericResult} from './util/helpers';25import waitNewBlocks from './substrate/wait-new-blocks';26import getBalance from './substrate/get-balance';2728chai.use(chaiAsPromised);29const expect = chai.expect;3031const UNIQUE_CHAIN = 1000;32const KARURA_CHAIN = 2000;33const KARURA_PORT = '9946';3435describe('Integration test: Exchanging QTZ with Karura', () => {36 let alice: IKeyringPair;37 38 before(async () => {39 await usingApi(async (api, privateKeyWrapper) => {40 alice = privateKeyWrapper('//Alice');41 });4243 const karuraApiOptions: ApiOptions = {44 provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT),45 };4647 await usingApi(async (api) => {48 const destination = {49 V0: {50 X2: [51 'Parent',52 {53 Parachain: UNIQUE_CHAIN,54 },55 ],56 },57 };5859 const metadata =60 {61 name: 'QTZ',62 symbol: 'QTZ',63 decimals: 18,64 minimalBalance: 1,65 };6667 const tx = api.tx.assetRegistry.registerForeignAsset(destination, metadata);68 const sudoTx = api.tx.sudo.sudo(tx as any);69 const events = await submitTransactionAsync(alice, sudoTx);70 const result = getGenericResult(events);71 expect(result.success).to.be.true;72 }, karuraApiOptions);73 });7475 it('Should connect and send QTZ to Karura', async () => {76 let balanceOnKaruraBefore: bigint;77 78 await usingApi(async (api) => {79 const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;80 balanceOnKaruraBefore = free;81 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});8283 await usingApi(async (api) => {84 const destination = {85 V0: {86 X2: [87 'Parent',88 {89 Parachain: KARURA_CHAIN,90 },91 ],92 },93 };9495 const beneficiary = {96 V0: {97 X1: {98 AccountId32: {99 network: 'Any',100 id: alice.addressRaw,101 },102 },103 },104 };105106 const assets = {107 V1: [108 {109 id: {110 Concrete: {111 parents: 0,112 interior: 'Here',113 },114 },115 fun: {116 Fungible: 5000000000,117 },118 },119 ],120 };121122 const feeAssetItem = 0;123124 const weightLimit = {125 Limited: 5000000000,126 };127128 const tx = api.tx.polkadotXcm.limitedReserveTransferAssets(destination, beneficiary, assets, feeAssetItem, weightLimit);129 const events = await submitTransactionAsync(alice, tx);130 const result = getGenericResult(events);131 expect(result.success).to.be.true;132 });133134 await usingApi(async (api) => {135 136 await waitNewBlocks(api, 3);137 const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;138 expect(free > balanceOnKaruraBefore).to.be.true;139 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});140 });141142 it('Should connect to Karura and send QTZ back', async () => {143 let balanceBefore: bigint;144 145 await usingApi(async (api) => {146 [balanceBefore] = await getBalance(api, [alice.address]);147 });148149 await usingApi(async (api) => {150 const destination = {151 V0: {152 X3: [153 'Parent',154 {155 Parachain: UNIQUE_CHAIN,156 },157 {158 AccountId32: {159 network: 'Any',160 id: alice.addressRaw,161 },162 },163 ],164 },165 };166167 const id = {168 ForeignAsset: 0,169 };170171 const amount = 5000000000;172 const destWeight = 50000000;173174 const tx = api.tx.xTokens.transfer(id, amount, destination, destWeight);175 const events = await submitTransactionAsync(alice, tx);176 const result = getGenericResult(events);177 expect(result.success).to.be.true;178 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});179180 await usingApi(async (api) => {181 182 await waitNewBlocks(api, 3);183 const [balanceAfter] = await getBalance(api, [alice.address]);184 expect(balanceAfter > balanceBefore).to.be.true;185 });186 });187});