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';34const TRANSFER_AMOUNT = 2000000000000000000000000n;3536describe.skip('Integration test: Exchanging QTZ with Karura', () => {37 let alice: IKeyringPair;3839 before(async () => {40 await usingApi(async (api, privateKeyWrapper) => {41 alice = privateKeyWrapper('//Alice');42 });4344 const karuraApiOptions: ApiOptions = {45 provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT),46 };4748 await usingApi(async (api) => {49 const destination = {50 V0: {51 X2: [52 'Parent',53 {54 Parachain: UNIQUE_CHAIN,55 },56 ],57 },58 };5960 const metadata =61 {62 name: 'QTZ',63 symbol: 'QTZ',64 decimals: 18,65 minimalBalance: 1,66 };6768 const tx = api.tx.assetRegistry.registerForeignAsset(destination, metadata);69 const sudoTx = api.tx.sudo.sudo(tx as any);70 const events = await submitTransactionAsync(alice, sudoTx);71 const result = getGenericResult(events);72 expect(result.success).to.be.true;73 }, karuraApiOptions);74 });7576 it('Should connect and send QTZ to Karura', async () => {77 let balanceOnKaruraBefore: bigint;7879 await usingApi(async (api) => {80 const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;81 balanceOnKaruraBefore = free;82 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});8384 await usingApi(async (api) => {85 const destination = {86 V0: {87 X2: [88 'Parent',89 {90 Parachain: KARURA_CHAIN,91 },92 ],93 },94 };9596 const beneficiary = {97 V0: {98 X1: {99 AccountId32: {100 network: 'Any',101 id: alice.addressRaw,102 },103 },104 },105 };106107 const assets = {108 V1: [109 {110 id: {111 Concrete: {112 parents: 0,113 interior: 'Here',114 },115 },116 fun: {117 Fungible: TRANSFER_AMOUNT,118 },119 },120 ],121 };122123 const feeAssetItem = 0;124125 const weightLimit = {126 Limited: 5000000000,127 };128129 const tx = api.tx.polkadotXcm.limitedReserveTransferAssets(destination, beneficiary, assets, feeAssetItem, weightLimit);130 const events = await submitTransactionAsync(alice, tx);131 const result = getGenericResult(events);132 expect(result.success).to.be.true;133 });134135 await usingApi(async (api) => {136 137 await waitNewBlocks(api, 3);138 const {free} = (await api.query.tokens.accounts(alice.addressRaw, {ForeignAsset: 0})).toJSON() as any;139 expect(free > balanceOnKaruraBefore).to.be.true;140 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});141 });142143 it('Should connect to Karura and send QTZ back', async () => {144 let balanceBefore: bigint;145146 await usingApi(async (api) => {147 [balanceBefore] = await getBalance(api, [alice.address]);148 });149150 await usingApi(async (api) => {151 const destination = {152 V1: {153 parents: 1,154 interior: {155 X2: [156 {Parachain: UNIQUE_CHAIN},157 {AccountId32: {158 network: 'Any',159 id: alice.addressRaw,160 }},161 ],162 },163 },164 };165166 const id = {167 ForeignAsset: 0,168 };169170 const amount = TRANSFER_AMOUNT;171 const destWeight = 50000000;172173 const tx = api.tx.xTokens.transfer(id, amount, destination, destWeight);174 const events = await submitTransactionAsync(alice, tx);175 const result = getGenericResult(events);176 expect(result.success).to.be.true;177 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});178179 await usingApi(async (api) => {180 181 await waitNewBlocks(api, 3);182 const [balanceAfter] = await getBalance(api, [alice.address]);183 expect(balanceAfter > balanceBefore).to.be.true;184 });185 });186});