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';27import {alicesPublicKey} from './accounts';2829chai.use(chaiAsPromised);30const expect = chai.expect;3132const UNIQUE_CHAIN = 1000;33const KARURA_CHAIN = 2000;34const KARURA_PORT = '9946';3536describe('Integration test: Exchanging QTZ with Karura', () => {37 let alice: IKeyringPair;38 39 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;78 79 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: 5000000000,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;145 146 await usingApi(async (api) => {147 [balanceBefore] = await getBalance(api, [alicesPublicKey]);148 });149150 await usingApi(async (api) => {151 const destination = {152 V0: {153 X3: [154 'Parent',155 {156 Parachain: UNIQUE_CHAIN,157 },158 {159 AccountId32: {160 network: 'Any',161 id: alice.addressRaw,162 },163 },164 ],165 },166 };167168 const id = {169 ForeignAsset: 0,170 };171172 const amount = 5000000000;173 const destWeight = 50000000;174175 const tx = api.tx.xTokens.transfer(id, amount, destination, destWeight);176 const events = await submitTransactionAsync(alice, tx);177 const result = getGenericResult(events);178 expect(result.success).to.be.true;179 }, {provider: new WsProvider('ws://127.0.0.1:' + KARURA_PORT)});180181 await usingApi(async (api) => {182 183 await waitNewBlocks(api, 3);184 const [balanceAfter] = await getBalance(api, [alicesPublicKey]);185 expect(balanceAfter > balanceBefore).to.be.true;186 });187 });188});