difftreelog
fix XCM tests
in: master
6 files changed
js-packages/playgrounds/types.xcm.tsdiffbeforeafterboth--- a/js-packages/playgrounds/types.xcm.ts
+++ b/js-packages/playgrounds/types.xcm.ts
@@ -27,10 +27,3 @@
conviction: number,
},
}
-
-export interface IForeignAssetMetadata {
- name?: number | Uint8Array,
- symbol?: string,
- decimals?: number,
- minimalBalance?: bigint,
-}
\ No newline at end of file
js-packages/playgrounds/unique.xcm.tsdiffbeforeafterboth1import {ApiPromise, WsProvider} from '@polkadot/api';2import type {IKeyringPair} from '@polkadot/types/types';3import {ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, UniqueHelper} from './unique.js';4import type {ILogger, TSigner, TSubstrateAccount} from './types.js';5import type {AcalaAssetMetadata, DemocracyStandardAccountVote, IForeignAssetMetadata, MoonbeamAssetInfo} from './types.xcm.js';678export class XcmChainHelper extends ChainHelperBase {9 override async connect(wsEndpoint: string, _listeners?: any): Promise<void> {10 const wsProvider = new WsProvider(wsEndpoint);11 this.api = new ApiPromise({12 provider: wsProvider,13 });14 await this.api.isReadyOrError;15 this.network = await UniqueHelper.detectNetwork(this.api);16 }17}1819class AcalaAssetRegistryGroup extends HelperGroup<AcalaHelper> {20 async registerForeignAsset(signer: TSigner, destination: any, metadata: AcalaAssetMetadata) {21 await this.helper.executeExtrinsic(signer, 'api.tx.assetRegistry.registerForeignAsset', [destination, metadata], true);22 }23}2425class MoonbeamAssetManagerGroup extends HelperGroup<MoonbeamHelper> {26 makeRegisterForeignAssetProposal(assetInfo: MoonbeamAssetInfo) {27 const apiPrefix = 'api.tx.assetManager.';2829 const registerTx = this.helper.constructApiCall(30 apiPrefix + 'registerForeignAsset',31 [assetInfo.location, assetInfo.metadata, assetInfo.existentialDeposit, assetInfo.isSufficient],32 );3334 const setUnitsTx = this.helper.constructApiCall(35 apiPrefix + 'setAssetUnitsPerSecond',36 [assetInfo.location, assetInfo.unitsPerSecond, assetInfo.numAssetsWeightHint],37 );3839 const batchCall = this.helper.getApi().tx.utility.batchAll([registerTx, setUnitsTx]);40 const encodedProposal = batchCall?.method.toHex() || '';41 return encodedProposal;42 }4344 async assetTypeId(location: any) {45 return await this.helper.callRpc('api.query.assetManager.assetTypeId', [location]);46 }47}4849class MoonbeamDemocracyGroup extends HelperGroup<MoonbeamHelper> {50 notePreimagePallet: string;5152 constructor(helper: MoonbeamHelper, options: { [key: string]: any } = {}) {53 super(helper);54 this.notePreimagePallet = options.notePreimagePallet;55 }5657 async notePreimage(signer: TSigner, encodedProposal: string) {58 await this.helper.executeExtrinsic(signer, `api.tx.${this.notePreimagePallet}.notePreimage`, [encodedProposal], true);59 }6061 externalProposeMajority(proposal: any) {62 return this.helper.constructApiCall('api.tx.democracy.externalProposeMajority', [proposal]);63 }6465 fastTrack(proposalHash: string, votingPeriod: number, delayPeriod: number) {66 return this.helper.constructApiCall('api.tx.democracy.fastTrack', [proposalHash, votingPeriod, delayPeriod]);67 }6869 async referendumVote(signer: TSigner, referendumIndex: number, accountVote: DemocracyStandardAccountVote) {70 await this.helper.executeExtrinsic(signer, 'api.tx.democracy.vote', [referendumIndex, {Standard: accountVote}], true);71 }72}7374class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {75 collective: string;7677 constructor(helper: MoonbeamHelper, collective: string) {78 super(helper);7980 this.collective = collective;81 }8283 async propose(signer: TSigner, threshold: number, proposalHash: string, lengthBound: number) {84 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.propose`, [threshold, proposalHash, lengthBound], true);85 }8687 async vote(signer: TSigner, proposalHash: string, proposalIndex: number, approve: boolean) {88 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.vote`, [proposalHash, proposalIndex, approve], true);89 }9091 async close(signer: TSigner, proposalHash: string, proposalIndex: number, weightBound: any, lengthBound: number) {92 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.close`, [proposalHash, proposalIndex, weightBound, lengthBound], true);93 }9495 async proposalCount() {96 return Number(await this.helper.callRpc(`api.query.${this.collective}.proposalCount`, []));97 }98}99100class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {101 async whitelistToken(signer: TSigner, assetId: any) {102 await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);103 }104}105106export class ForeignAssetsGroup extends HelperGroup<UniqueHelper> {107 async register(signer: TSigner, ownerAddress: TSubstrateAccount, location: any, metadata: IForeignAssetMetadata) {108 await this.helper.executeExtrinsic(109 signer,110 'api.tx.foreignAssets.registerForeignAsset',111 [ownerAddress, location, metadata],112 true,113 );114 }115116 async update(signer: TSigner, foreignAssetId: number, location: any, metadata: IForeignAssetMetadata) {117 await this.helper.executeExtrinsic(118 signer,119 'api.tx.foreignAssets.updateForeignAsset',120 [foreignAssetId, location, metadata],121 true,122 );123 }124}125126export class XcmGroup<T extends ChainHelperBase> extends HelperGroup<T> {127 palletName: string;128129 constructor(helper: T, palletName: string) {130 super(helper);131132 this.palletName = palletName;133 }134135 async limitedReserveTransferAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number, weightLimit: any) {136 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.limitedReserveTransferAssets`, [destination, beneficiary, assets, feeAssetItem, weightLimit], true);137 }138139 async setSafeXcmVersion(signer: TSigner, version: number) {140 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.forceDefaultXcmVersion`, [version], true);141 }142143 async teleportAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number) {144 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.teleportAssets`, [destination, beneficiary, assets, feeAssetItem], true);145 }146147 async teleportNativeAsset(signer: TSigner, destinationParaId: number, targetAccount: Uint8Array, amount: bigint, xcmVersion = 3) {148 const destinationContent = {149 parents: 0,150 interior: {151 X1: {152 Parachain: destinationParaId,153 },154 },155 };156157 const beneficiaryContent = {158 parents: 0,159 interior: {160 X1: {161 AccountId32: {162 network: 'Any',163 id: targetAccount,164 },165 },166 },167 };168169 const assetsContent = [170 {171 id: {172 Concrete: {173 parents: 0,174 interior: 'Here',175 },176 },177 fun: {178 Fungible: amount,179 },180 },181 ];182183 let destination;184 let beneficiary;185 let assets;186187 if(xcmVersion == 2) {188 destination = {V1: destinationContent};189 beneficiary = {V1: beneficiaryContent};190 assets = {V1: assetsContent};191192 } else if(xcmVersion == 3) {193 destination = {V2: destinationContent};194 beneficiary = {V2: beneficiaryContent};195 assets = {V2: assetsContent};196197 } else {198 throw Error('Unknown XCM version: ' + xcmVersion);199 }200201 const feeAssetItem = 0;202203 await this.teleportAssets(signer, destination, beneficiary, assets, feeAssetItem);204 }205206 async send(signer: IKeyringPair, destination: any, message: any) {207 await this.helper.executeExtrinsic(208 signer,209 `api.tx.${this.palletName}.send`,210 [211 destination,212 message,213 ],214 true,215 );216 }217}218219export class XTokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {220 async transfer(signer: TSigner, currencyId: any, amount: bigint, destination: any, destWeight: any) {221 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transfer', [currencyId, amount, destination, destWeight], true);222 }223224 async transferMultiasset(signer: TSigner, asset: any, destination: any, destWeight: any) {225 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMultiasset', [asset, destination, destWeight], true);226 }227228 async transferMulticurrencies(signer: TSigner, currencies: any[], feeItem: number, destLocation: any, destWeight: any) {229 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMulticurrencies', [currencies, feeItem, destLocation, destWeight], true);230 }231}232233234235export class TokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {236 async accounts(address: string, currencyId: any) {237 const {free} = (await this.helper.callRpc('api.query.tokens.accounts', [address, currencyId])).toJSON() as any;238 return BigInt(free);239 }240}241242export class AssetsGroup<T extends ChainHelperBase> extends HelperGroup<T> {243 async create(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint) {244 await this.helper.executeExtrinsic(signer, 'api.tx.assets.create', [assetId, admin, minimalBalance], true);245 }246247 async forceCreate(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint, isSufficient = true) {248 await this.helper.executeExtrinsic(signer, 'api.tx.assets.forceCreate', [assetId, admin, isSufficient, minimalBalance], true);249 }250251 async setMetadata(signer: TSigner, assetId: number | bigint, name: string, symbol: string, decimals: number) {252 await this.helper.executeExtrinsic(signer, 'api.tx.assets.setMetadata', [assetId, name, symbol, decimals], true);253 }254255 async mint(signer: TSigner, assetId: number | bigint, beneficiary: string, amount: bigint) {256 await this.helper.executeExtrinsic(signer, 'api.tx.assets.mint', [assetId, beneficiary, amount], true);257 }258259 async account(assetId: string | number | bigint, address: string) {260 const accountAsset = (261 await this.helper.callRpc('api.query.assets.account', [assetId, address])262 ).toJSON()! as any;263264 if(accountAsset !== null) {265 return BigInt(accountAsset['balance']);266 } else {267 return null;268 }269 }270}271272export class RelayHelper extends XcmChainHelper {273 balance: SubstrateBalanceGroup<RelayHelper>;274 xcm: XcmGroup<RelayHelper>;275276 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {277 super(logger, options.helperBase ?? RelayHelper);278279 this.balance = new SubstrateBalanceGroup(this);280 this.xcm = new XcmGroup(this, 'xcmPallet');281 }282}283284export class WestmintHelper extends XcmChainHelper {285 balance: SubstrateBalanceGroup<WestmintHelper>;286 xcm: XcmGroup<WestmintHelper>;287 assets: AssetsGroup<WestmintHelper>;288 xTokens: XTokensGroup<WestmintHelper>;289290 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {291 super(logger, options.helperBase ?? WestmintHelper);292293 this.balance = new SubstrateBalanceGroup(this);294 this.xcm = new XcmGroup(this, 'polkadotXcm');295 this.assets = new AssetsGroup(this);296 this.xTokens = new XTokensGroup(this);297 }298}299300export class MoonbeamHelper extends XcmChainHelper {301 balance: EthereumBalanceGroup<MoonbeamHelper>;302 assetManager: MoonbeamAssetManagerGroup;303 assets: AssetsGroup<MoonbeamHelper>;304 xTokens: XTokensGroup<MoonbeamHelper>;305 democracy: MoonbeamDemocracyGroup;306 collective: {307 council: MoonbeamCollectiveGroup,308 techCommittee: MoonbeamCollectiveGroup,309 };310311 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {312 super(logger, options.helperBase ?? MoonbeamHelper);313314 this.balance = new EthereumBalanceGroup(this);315 this.assetManager = new MoonbeamAssetManagerGroup(this);316 this.assets = new AssetsGroup(this);317 this.xTokens = new XTokensGroup(this);318 this.democracy = new MoonbeamDemocracyGroup(this, options);319 this.collective = {320 council: new MoonbeamCollectiveGroup(this, 'councilCollective'),321 techCommittee: new MoonbeamCollectiveGroup(this, 'techCommitteeCollective'),322 };323 }324}325326export class AstarHelper extends XcmChainHelper {327 balance: SubstrateBalanceGroup<AstarHelper>;328 assets: AssetsGroup<AstarHelper>;329 xcm: XcmGroup<AstarHelper>;330331 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {332 super(logger, options.helperBase ?? AstarHelper);333334 this.balance = new SubstrateBalanceGroup(this);335 this.assets = new AssetsGroup(this);336 this.xcm = new XcmGroup(this, 'polkadotXcm');337 }338}339340export class AcalaHelper extends XcmChainHelper {341 balance: SubstrateBalanceGroup<AcalaHelper>;342 assetRegistry: AcalaAssetRegistryGroup;343 xTokens: XTokensGroup<AcalaHelper>;344 tokens: TokensGroup<AcalaHelper>;345 xcm: XcmGroup<AcalaHelper>;346347 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {348 super(logger, options.helperBase ?? AcalaHelper);349350 this.balance = new SubstrateBalanceGroup(this);351 this.assetRegistry = new AcalaAssetRegistryGroup(this);352 this.xTokens = new XTokensGroup(this);353 this.tokens = new TokensGroup(this);354 this.xcm = new XcmGroup(this, 'polkadotXcm');355 }356}357358export class PolkadexHelper extends XcmChainHelper {359 assets: AssetsGroup<PolkadexHelper>;360 balance: SubstrateBalanceGroup<PolkadexHelper>;361 xTokens: XTokensGroup<PolkadexHelper>;362 xcm: XcmGroup<PolkadexHelper>;363 xcmHelper: PolkadexXcmHelperGroup<PolkadexHelper>;364365 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {366 super(logger, options.helperBase ?? PolkadexHelper);367368 this.assets = new AssetsGroup(this);369 this.balance = new SubstrateBalanceGroup(this);370 this.xTokens = new XTokensGroup(this);371 this.xcm = new XcmGroup(this, 'polkadotXcm');372 this.xcmHelper = new PolkadexXcmHelperGroup(this);373 }374}3751import {ApiPromise, WsProvider} from '@polkadot/api';2import type {IKeyringPair} from '@polkadot/types/types';3import {ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, UniqueHelper} from './unique.js';4import type {ILogger, TSigner, TSubstrateAccount} from './types.js';5import type {AcalaAssetMetadata, DemocracyStandardAccountVote, MoonbeamAssetInfo} from './types.xcm.js';678export class XcmChainHelper extends ChainHelperBase {9 override async connect(wsEndpoint: string, _listeners?: any): Promise<void> {10 const wsProvider = new WsProvider(wsEndpoint);11 this.api = new ApiPromise({12 provider: wsProvider,13 });14 await this.api.isReadyOrError;15 this.network = await UniqueHelper.detectNetwork(this.api);16 }17}1819class AcalaAssetRegistryGroup extends HelperGroup<AcalaHelper> {20 async registerForeignAsset(signer: TSigner, destination: any, metadata: AcalaAssetMetadata) {21 await this.helper.executeExtrinsic(signer, 'api.tx.assetRegistry.registerForeignAsset', [destination, metadata], true);22 }23}2425class MoonbeamAssetManagerGroup extends HelperGroup<MoonbeamHelper> {26 makeRegisterForeignAssetProposal(assetInfo: MoonbeamAssetInfo) {27 const apiPrefix = 'api.tx.assetManager.';2829 const registerTx = this.helper.constructApiCall(30 apiPrefix + 'registerForeignAsset',31 [assetInfo.location, assetInfo.metadata, assetInfo.existentialDeposit, assetInfo.isSufficient],32 );3334 const setUnitsTx = this.helper.constructApiCall(35 apiPrefix + 'setAssetUnitsPerSecond',36 [assetInfo.location, assetInfo.unitsPerSecond, assetInfo.numAssetsWeightHint],37 );3839 const batchCall = this.helper.getApi().tx.utility.batchAll([registerTx, setUnitsTx]);40 const encodedProposal = batchCall?.method.toHex() || '';41 return encodedProposal;42 }4344 async assetTypeId(location: any) {45 return await this.helper.callRpc('api.query.assetManager.assetTypeId', [location]);46 }47}4849class MoonbeamDemocracyGroup extends HelperGroup<MoonbeamHelper> {50 notePreimagePallet: string;5152 constructor(helper: MoonbeamHelper, options: { [key: string]: any } = {}) {53 super(helper);54 this.notePreimagePallet = options.notePreimagePallet;55 }5657 async notePreimage(signer: TSigner, encodedProposal: string) {58 await this.helper.executeExtrinsic(signer, `api.tx.${this.notePreimagePallet}.notePreimage`, [encodedProposal], true);59 }6061 externalProposeMajority(proposal: any) {62 return this.helper.constructApiCall('api.tx.democracy.externalProposeMajority', [proposal]);63 }6465 fastTrack(proposalHash: string, votingPeriod: number, delayPeriod: number) {66 return this.helper.constructApiCall('api.tx.democracy.fastTrack', [proposalHash, votingPeriod, delayPeriod]);67 }6869 async referendumVote(signer: TSigner, referendumIndex: number, accountVote: DemocracyStandardAccountVote) {70 await this.helper.executeExtrinsic(signer, 'api.tx.democracy.vote', [referendumIndex, {Standard: accountVote}], true);71 }72}7374class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {75 collective: string;7677 constructor(helper: MoonbeamHelper, collective: string) {78 super(helper);7980 this.collective = collective;81 }8283 async propose(signer: TSigner, threshold: number, proposalHash: string, lengthBound: number) {84 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.propose`, [threshold, proposalHash, lengthBound], true);85 }8687 async vote(signer: TSigner, proposalHash: string, proposalIndex: number, approve: boolean) {88 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.vote`, [proposalHash, proposalIndex, approve], true);89 }9091 async close(signer: TSigner, proposalHash: string, proposalIndex: number, weightBound: any, lengthBound: number) {92 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.close`, [proposalHash, proposalIndex, weightBound, lengthBound], true);93 }9495 async proposalCount() {96 return Number(await this.helper.callRpc(`api.query.${this.collective}.proposalCount`, []));97 }98}99100class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {101 async whitelistToken(signer: TSigner, assetId: any) {102 await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);103 }104}105106export class ForeignAssetsGroup extends HelperGroup<UniqueHelper> {107 async register(signer: TSigner, location: any, name: string, tokenPrefix: string, mode: 'NFT' | { Fungible: number }) {108 await this.helper.executeExtrinsic(109 signer,110 'api.tx.foreignAssets.forceRegisterForeignAsset',111 [location, this.helper.util.str2vec(name), tokenPrefix, mode],112 true,113 );114 }115116 async foreignCollectionId(location: any) {117 return (await this.helper.callRpc('api.query.foreignAssets.foreignReserveLocationToCollection', [location])).toJSON();118 }119}120121export class XcmGroup<T extends ChainHelperBase> extends HelperGroup<T> {122 palletName: string;123124 constructor(helper: T, palletName: string) {125 super(helper);126127 this.palletName = palletName;128 }129130 async limitedReserveTransferAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number, weightLimit: any) {131 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.limitedReserveTransferAssets`, [destination, beneficiary, assets, feeAssetItem, weightLimit], true);132 }133134 async setSafeXcmVersion(signer: TSigner, version: number) {135 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.forceDefaultXcmVersion`, [version], true);136 }137138 async teleportAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number) {139 await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.teleportAssets`, [destination, beneficiary, assets, feeAssetItem], true);140 }141142 async teleportNativeAsset(signer: TSigner, destinationParaId: number, targetAccount: Uint8Array, amount: bigint, xcmVersion = 3) {143 const destinationContent = {144 parents: 0,145 interior: {146 X1: {147 Parachain: destinationParaId,148 },149 },150 };151152 const beneficiaryContent = {153 parents: 0,154 interior: {155 X1: {156 AccountId32: {157 network: 'Any',158 id: targetAccount,159 },160 },161 },162 };163164 const assetsContent = [165 {166 id: {167 Concrete: {168 parents: 0,169 interior: 'Here',170 },171 },172 fun: {173 Fungible: amount,174 },175 },176 ];177178 let destination;179 let beneficiary;180 let assets;181182 if(xcmVersion == 2) {183 destination = {V1: destinationContent};184 beneficiary = {V1: beneficiaryContent};185 assets = {V1: assetsContent};186187 } else if(xcmVersion == 3) {188 destination = {V2: destinationContent};189 beneficiary = {V2: beneficiaryContent};190 assets = {V2: assetsContent};191192 } else {193 throw Error('Unknown XCM version: ' + xcmVersion);194 }195196 const feeAssetItem = 0;197198 await this.teleportAssets(signer, destination, beneficiary, assets, feeAssetItem);199 }200201 async send(signer: IKeyringPair, destination: any, message: any) {202 await this.helper.executeExtrinsic(203 signer,204 `api.tx.${this.palletName}.send`,205 [206 destination,207 message,208 ],209 true,210 );211 }212}213214export class XTokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {215 async transfer(signer: TSigner, currencyId: any, amount: bigint, destination: any, destWeight: any) {216 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transfer', [currencyId, amount, destination, destWeight], true);217 }218219 async transferMultiasset(signer: TSigner, asset: any, destination: any, destWeight: any) {220 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMultiasset', [asset, destination, destWeight], true);221 }222223 async transferMulticurrencies(signer: TSigner, currencies: any[], feeItem: number, destLocation: any, destWeight: any) {224 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMulticurrencies', [currencies, feeItem, destLocation, destWeight], true);225 }226}227228229230export class TokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {231 async accounts(address: string, currencyId: any) {232 const {free} = (await this.helper.callRpc('api.query.tokens.accounts', [address, currencyId])).toJSON() as any;233 return BigInt(free);234 }235}236237export class AssetsGroup<T extends ChainHelperBase> extends HelperGroup<T> {238 async create(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint) {239 await this.helper.executeExtrinsic(signer, 'api.tx.assets.create', [assetId, admin, minimalBalance], true);240 }241242 async forceCreate(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint, isSufficient = true) {243 await this.helper.executeExtrinsic(signer, 'api.tx.assets.forceCreate', [assetId, admin, isSufficient, minimalBalance], true);244 }245246 async setMetadata(signer: TSigner, assetId: number | bigint, name: string, symbol: string, decimals: number) {247 await this.helper.executeExtrinsic(signer, 'api.tx.assets.setMetadata', [assetId, name, symbol, decimals], true);248 }249250 async mint(signer: TSigner, assetId: number | bigint, beneficiary: string, amount: bigint) {251 await this.helper.executeExtrinsic(signer, 'api.tx.assets.mint', [assetId, beneficiary, amount], true);252 }253254 async assetInfo(assetId: number | bigint) {255 return (await this.helper.callRpc('api.query.assets.asset', [assetId])).toJSON();256 }257258 async account(assetId: string | number | bigint, address: string) {259 const accountAsset = (260 await this.helper.callRpc('api.query.assets.account', [assetId, address])261 ).toJSON()! as any;262263 if(accountAsset !== null) {264 return BigInt(accountAsset['balance']);265 } else {266 return null;267 }268 }269}270271export class RelayHelper extends XcmChainHelper {272 balance: SubstrateBalanceGroup<RelayHelper>;273 xcm: XcmGroup<RelayHelper>;274275 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {276 super(logger, options.helperBase ?? RelayHelper);277278 this.balance = new SubstrateBalanceGroup(this);279 this.xcm = new XcmGroup(this, 'xcmPallet');280 }281}282283export class WestmintHelper extends XcmChainHelper {284 balance: SubstrateBalanceGroup<WestmintHelper>;285 xcm: XcmGroup<WestmintHelper>;286 assets: AssetsGroup<WestmintHelper>;287 xTokens: XTokensGroup<WestmintHelper>;288289 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {290 super(logger, options.helperBase ?? WestmintHelper);291292 this.balance = new SubstrateBalanceGroup(this);293 this.xcm = new XcmGroup(this, 'polkadotXcm');294 this.assets = new AssetsGroup(this);295 this.xTokens = new XTokensGroup(this);296 }297}298299export class MoonbeamHelper extends XcmChainHelper {300 balance: EthereumBalanceGroup<MoonbeamHelper>;301 assetManager: MoonbeamAssetManagerGroup;302 assets: AssetsGroup<MoonbeamHelper>;303 xTokens: XTokensGroup<MoonbeamHelper>;304 democracy: MoonbeamDemocracyGroup;305 collective: {306 council: MoonbeamCollectiveGroup,307 techCommittee: MoonbeamCollectiveGroup,308 };309310 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {311 super(logger, options.helperBase ?? MoonbeamHelper);312313 this.balance = new EthereumBalanceGroup(this);314 this.assetManager = new MoonbeamAssetManagerGroup(this);315 this.assets = new AssetsGroup(this);316 this.xTokens = new XTokensGroup(this);317 this.democracy = new MoonbeamDemocracyGroup(this, options);318 this.collective = {319 council: new MoonbeamCollectiveGroup(this, 'councilCollective'),320 techCommittee: new MoonbeamCollectiveGroup(this, 'techCommitteeCollective'),321 };322 }323}324325export class AstarHelper extends XcmChainHelper {326 balance: SubstrateBalanceGroup<AstarHelper>;327 assets: AssetsGroup<AstarHelper>;328 xcm: XcmGroup<AstarHelper>;329330 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {331 super(logger, options.helperBase ?? AstarHelper);332333 this.balance = new SubstrateBalanceGroup(this);334 this.assets = new AssetsGroup(this);335 this.xcm = new XcmGroup(this, 'polkadotXcm');336 }337}338339export class AcalaHelper extends XcmChainHelper {340 balance: SubstrateBalanceGroup<AcalaHelper>;341 assetRegistry: AcalaAssetRegistryGroup;342 xTokens: XTokensGroup<AcalaHelper>;343 tokens: TokensGroup<AcalaHelper>;344 xcm: XcmGroup<AcalaHelper>;345346 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {347 super(logger, options.helperBase ?? AcalaHelper);348349 this.balance = new SubstrateBalanceGroup(this);350 this.assetRegistry = new AcalaAssetRegistryGroup(this);351 this.xTokens = new XTokensGroup(this);352 this.tokens = new TokensGroup(this);353 this.xcm = new XcmGroup(this, 'polkadotXcm');354 }355}356357export class PolkadexHelper extends XcmChainHelper {358 assets: AssetsGroup<PolkadexHelper>;359 balance: SubstrateBalanceGroup<PolkadexHelper>;360 xTokens: XTokensGroup<PolkadexHelper>;361 xcm: XcmGroup<PolkadexHelper>;362 xcmHelper: PolkadexXcmHelperGroup<PolkadexHelper>;363364 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {365 super(logger, options.helperBase ?? PolkadexHelper);366367 this.assets = new AssetsGroup(this);368 this.balance = new SubstrateBalanceGroup(this);369 this.xTokens = new XTokensGroup(this);370 this.xcm = new XcmGroup(this, 'polkadotXcm');371 this.xcmHelper = new PolkadexXcmHelperGroup(this);372 }373}374js-packages/tests/xcm/xcm.types.tsdiffbeforeafterboth--- a/js-packages/tests/xcm/xcm.types.ts
+++ b/js-packages/tests/xcm/xcm.types.ts
@@ -505,4 +505,26 @@
await expectFailedToTransact(helper, messageSent);
});
}
+
+ async registerRelayNativeTokenOnUnique(alice: IKeyringPair) {
+ return await usingPlaygrounds(async (helper) => {
+ const relayLocation = {
+ parents: 1,
+ interior: 'Here',
+ };
+
+ const relayCollectionId = await helper.foreignAssets.foreignCollectionId(relayLocation);
+ if(relayCollectionId == null) {
+ const name = 'Relay Tokens';
+ const tokenPrefix = 'xDOT';
+ const decimals = 10;
+ await helper.getSudo().foreignAssets.register(alice, relayLocation, name, tokenPrefix, {Fungible: decimals});
+
+ return await helper.foreignAssets.foreignCollectionId(relayLocation);
+ } else {
+ console.log('Relay foreign collection is already registered');
+ return relayCollectionId;
+ }
+ });
+ }
}
js-packages/tests/xcm/xcmOpal.test.tsdiffbeforeafterboth--- a/js-packages/tests/xcm/xcmOpal.test.ts
+++ b/js-packages/tests/xcm/xcmOpal.test.ts
@@ -17,6 +17,7 @@
import type {IKeyringPair} from '@polkadot/types/types';
import config from '../config.js';
import {itSub, expect, describeXCM, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util/index.js';
+import {XcmTestHelper} from './xcm.types';
const STATEMINE_CHAIN = +(process.env.RELAY_WESTMINT_ID || 1000);
const UNIQUE_CHAIN = +(process.env.RELAY_OPAL_ID || 2095);
@@ -25,11 +26,11 @@
const westmintUrl = config.westmintUrl;
const STATEMINE_PALLET_INSTANCE = 50;
-const ASSET_ID = 100;
-const ASSET_METADATA_DECIMALS = 18;
-const ASSET_METADATA_NAME = 'USDT';
-const ASSET_METADATA_DESCRIPTION = 'USDT';
-const ASSET_METADATA_MINIMAL_BALANCE = 1n;
+const USDT_ASSET_ID = 100;
+const USDT_ASSET_METADATA_DECIMALS = 18;
+const USDT_ASSET_METADATA_NAME = 'USDT';
+const USDT_ASSET_METADATA_DESCRIPTION = 'USDT';
+const USDT_ASSET_METADATA_MINIMAL_BALANCE = 1n;
const RELAY_DECIMALS = 12;
const WESTMINT_DECIMALS = 12;
@@ -37,7 +38,9 @@
const TRANSFER_AMOUNT = 1_000_000_000_000_000_000n;
// 10,000.00 (ten thousands) USDT
-const ASSET_AMOUNT = 1_000_000_000_000_000_000_000n;
+const USDT_ASSET_AMOUNT = 1_000_000_000_000_000_000_000n;
+
+const testHelper = new XcmTestHelper('opal');
describeXCM('[XCM] Integration test: Exchanging USDT with Westmint', () => {
let alice: IKeyringPair;
@@ -57,57 +60,78 @@
let balanceBobRelayTokenBefore: bigint;
let balanceBobRelayTokenAfter: bigint;
+ let usdtCollectionId: number;
+ let relayCollectionId: number;
before(async () => {
await usingPlaygrounds(async (_helper, privateKey) => {
alice = await privateKey('//Alice');
bob = await privateKey('//Bob'); // funds donor
+
+ relayCollectionId = await testHelper.registerRelayNativeTokenOnUnique(alice);
});
await usingWestmintPlaygrounds(westmintUrl, async (helper) => {
- // 350.00 (three hundred fifty) DOT
- const fundingAmount = 3_500_000_000_000n;
+ const assetInfo = await helper.assets.assetInfo(USDT_ASSET_ID);
+ if(assetInfo == null) {
+ await helper.assets.create(
+ alice,
+ USDT_ASSET_ID,
+ alice.address,
+ USDT_ASSET_METADATA_MINIMAL_BALANCE,
+ );
+ await helper.assets.setMetadata(
+ alice,
+ USDT_ASSET_ID,
+ USDT_ASSET_METADATA_NAME,
+ USDT_ASSET_METADATA_DESCRIPTION,
+ USDT_ASSET_METADATA_DECIMALS,
+ );
+ } else {
+ console.log('The USDT asset is already registered on AssetHub');
+ }
- await helper.assets.create(alice, ASSET_ID, alice.address, ASSET_METADATA_MINIMAL_BALANCE);
- await helper.assets.setMetadata(alice, ASSET_ID, ASSET_METADATA_NAME, ASSET_METADATA_DESCRIPTION, ASSET_METADATA_DECIMALS);
- await helper.assets.mint(alice, ASSET_ID, alice.address, ASSET_AMOUNT);
+ await helper.assets.mint(
+ alice,
+ USDT_ASSET_ID,
+ alice.address,
+ USDT_ASSET_AMOUNT,
+ );
+
+ const sovereignFundingAmount = 3_500_000_000n;
// funding parachain sovereing account (Parachain: 2095)
const parachainSovereingAccount = helper.address.paraSiblingSovereignAccount(UNIQUE_CHAIN);
- await helper.balance.transferToSubstrate(bob, parachainSovereingAccount, fundingAmount);
+ await helper.balance.transferToSubstrate(bob, parachainSovereingAccount, sovereignFundingAmount);
});
-
await usingPlaygrounds(async (helper) => {
const location = {
- V2: {
- parents: 1,
- interior: {X3: [
- {
- Parachain: STATEMINE_CHAIN,
- },
- {
- PalletInstance: STATEMINE_PALLET_INSTANCE,
- },
- {
- GeneralIndex: ASSET_ID,
- },
- ]},
- },
+ parents: 1,
+ interior: {X3: [
+ {
+ Parachain: STATEMINE_CHAIN,
+ },
+ {
+ PalletInstance: STATEMINE_PALLET_INSTANCE,
+ },
+ {
+ GeneralIndex: USDT_ASSET_ID,
+ },
+ ]},
};
- const metadata =
- {
- name: ASSET_ID,
- symbol: ASSET_METADATA_NAME,
- decimals: ASSET_METADATA_DECIMALS,
- minimalBalance: ASSET_METADATA_MINIMAL_BALANCE,
- };
- await helper.getSudo().foreignAssets.register(alice, alice.address, location, metadata);
+ if(await helper.foreignAssets.foreignCollectionId(location) == null) {
+ const tokenPrefix = USDT_ASSET_METADATA_NAME;
+ await helper.getSudo().foreignAssets.register(alice, location, USDT_ASSET_METADATA_NAME, tokenPrefix, {Fungible: USDT_ASSET_METADATA_DECIMALS});
+ } else {
+ console.log('Foreign collection is already registered on Opal');
+ }
+
balanceOpalBefore = await helper.balance.getSubstrate(alice.address);
+ usdtCollectionId = await helper.foreignAssets.foreignCollectionId(location);
});
-
// Providing the relay currency to the unique sender account
await usingRelayPlaygrounds(relayUrl, async (helper) => {
const destination = {
@@ -189,7 +213,7 @@
PalletInstance: STATEMINE_PALLET_INSTANCE,
},
{
- GeneralIndex: ASSET_ID,
+ GeneralIndex: USDT_ASSET_ID,
},
]},
},
@@ -216,19 +240,17 @@
expect(balanceStmnBefore > balanceStmnAfter).to.be.true;
});
-
// ensure that asset has been delivered
await helper.wait.newBlocks(3);
- // expext collection id will be with id 1
- const free = await helper.ft.getBalance(1, {Substrate: alice.address});
+ const free = await helper.ft.getBalance(usdtCollectionId, {Substrate: alice.address});
balanceOpalAfter = await helper.balance.getSubstrate(alice.address);
console.log(
'[Westmint -> Opal] transaction fees on Opal: %s USDT',
- helper.util.bigIntToDecimals(TRANSFER_AMOUNT - free, ASSET_METADATA_DECIMALS),
+ helper.util.bigIntToDecimals(TRANSFER_AMOUNT - free, USDT_ASSET_METADATA_DECIMALS),
);
console.log(
'[Westmint -> Opal] transaction fees on Opal: %s OPL',
@@ -261,16 +283,11 @@
const currencies: [any, bigint][] = [
[
- {
- ForeignAssetId: 0,
- },
- //10_000_000_000_000_000n,
+ usdtCollectionId,
TRANSFER_AMOUNT,
],
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
400_000_000_000_000n,
],
];
@@ -288,7 +305,7 @@
// The USDT token never paid fees. Its amount not changed from begin value.
// Also check that xcm transfer has been succeeded
- expect((await helper.assets.account(ASSET_ID, alice.address))! == ASSET_AMOUNT).to.be.true;
+ expect((await helper.assets.account(USDT_ASSET_ID, alice.address))! == USDT_ASSET_AMOUNT).to.be.true;
});
});
@@ -296,7 +313,7 @@
const TRANSFER_AMOUNT_RELAY = 50_000_000_000_000_000n;
balanceBobBefore = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenBefore = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenBefore = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
// Providing the relay currency to the unique sender account
await usingRelayPlaygrounds(relayUrl, async (helper) => {
@@ -345,7 +362,7 @@
await helper.wait.newBlocks(3);
balanceBobAfter = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenAfter = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenAfter = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
const wndFee = balanceBobRelayTokenAfter - TRANSFER_AMOUNT_RELAY - balanceBobRelayTokenBefore;
console.log(
@@ -383,9 +400,7 @@
const currencies: any = [
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
50_000_000_000_000_000n,
],
];
js-packages/tests/xcm/xcmQuartz.test.tsdiffbeforeafterboth--- a/js-packages/tests/xcm/xcmQuartz.test.ts
+++ b/js-packages/tests/xcm/xcmQuartz.test.ts
@@ -19,9 +19,8 @@
import {DevUniqueHelper, Event} from '@unique/playgrounds/unique.dev.js';
import {STATEMINE_CHAIN, QUARTZ_CHAIN, KARURA_CHAIN, MOONRIVER_CHAIN, SHIDEN_CHAIN, STATEMINE_DECIMALS, KARURA_DECIMALS, QTZ_DECIMALS, RELAY_DECIMALS, SHIDEN_DECIMALS, karuraUrl, moonriverUrl, relayUrl, shidenUrl, statemineUrl} from './xcm.types.js';
import {hexToString} from '@polkadot/util';
-
+import {XcmTestHelper} from './xcm.types';
-
const STATEMINE_PALLET_INSTANCE = 50;
const TRANSFER_AMOUNT = 2000000000000000000000000n;
@@ -39,6 +38,8 @@
const SAFE_XCM_VERSION = 2;
+const testHelper = new XcmTestHelper('quartz');
+
describeXCM('[XCM] Integration test: Exchanging USDT with Statemine', () => {
let alice: IKeyringPair;
let bob: IKeyringPair;
@@ -57,6 +58,8 @@
let balanceBobRelayTokenBefore: bigint;
let balanceBobRelayTokenAfter: bigint;
+ let usdtCollectionId: number;
+ let relayCollectionId: number;
before(async () => {
await usingPlaygrounds(async (helper, privateKey) => {
@@ -65,6 +68,8 @@
// Set the default version to wrap the first message to other chains.
await helper.getSudo().xcm.setSafeXcmVersion(alice, SAFE_XCM_VERSION);
+
+ relayCollectionId = await testHelper.registerRelayNativeTokenOnUnique(alice);
});
await usingRelayPlaygrounds(relayUrl, async (helper) => {
@@ -74,21 +79,25 @@
});
await usingStateminePlaygrounds(statemineUrl, async (helper) => {
- const sovereignFundingAmount = 3_500_000_000n;
+ const assetInfo = await helper.assets.assetInfo(USDT_ASSET_ID);
+ if(assetInfo == null) {
+ await helper.assets.create(
+ alice,
+ USDT_ASSET_ID,
+ alice.address,
+ USDT_ASSET_METADATA_MINIMAL_BALANCE,
+ );
+ await helper.assets.setMetadata(
+ alice,
+ USDT_ASSET_ID,
+ USDT_ASSET_METADATA_NAME,
+ USDT_ASSET_METADATA_DESCRIPTION,
+ USDT_ASSET_METADATA_DECIMALS,
+ );
+ } else {
+ console.log('The USDT asset is already registered on AssetHub');
+ }
- await helper.assets.create(
- alice,
- USDT_ASSET_ID,
- alice.address,
- USDT_ASSET_METADATA_MINIMAL_BALANCE,
- );
- await helper.assets.setMetadata(
- alice,
- USDT_ASSET_ID,
- USDT_ASSET_METADATA_NAME,
- USDT_ASSET_METADATA_DESCRIPTION,
- USDT_ASSET_METADATA_DECIMALS,
- );
await helper.assets.mint(
alice,
USDT_ASSET_ID,
@@ -96,6 +105,8 @@
USDT_ASSET_AMOUNT,
);
+ const sovereignFundingAmount = 3_500_000_000n;
+
// funding parachain sovereing account on Statemine(t).
// The sovereign account should be created before any action
// (the assets pallet on Statemine(t) check if the sovereign account exists)
@@ -106,31 +117,29 @@
await usingPlaygrounds(async (helper) => {
const location = {
- V2: {
- parents: 1,
- interior: {X3: [
- {
- Parachain: STATEMINE_CHAIN,
- },
- {
- PalletInstance: STATEMINE_PALLET_INSTANCE,
- },
- {
- GeneralIndex: USDT_ASSET_ID,
- },
- ]},
- },
+ parents: 1,
+ interior: {X3: [
+ {
+ Parachain: STATEMINE_CHAIN,
+ },
+ {
+ PalletInstance: STATEMINE_PALLET_INSTANCE,
+ },
+ {
+ GeneralIndex: USDT_ASSET_ID,
+ },
+ ]},
};
- const metadata =
- {
- name: USDT_ASSET_ID,
- symbol: USDT_ASSET_METADATA_NAME,
- decimals: USDT_ASSET_METADATA_DECIMALS,
- minimalBalance: USDT_ASSET_METADATA_MINIMAL_BALANCE,
- };
- await helper.getSudo().foreignAssets.register(alice, alice.address, location, metadata);
+ if(await helper.foreignAssets.foreignCollectionId(location) == null) {
+ const tokenPrefix = USDT_ASSET_METADATA_NAME;
+ await helper.getSudo().foreignAssets.register(alice, location, USDT_ASSET_METADATA_NAME, tokenPrefix, {Fungible: USDT_ASSET_METADATA_DECIMALS});
+ } else {
+ console.log('Foreign collection is already registered on Quartz');
+ }
+
balanceQuartzBefore = await helper.balance.getSubstrate(alice.address);
+ usdtCollectionId = await helper.foreignAssets.foreignCollectionId(location);
});
@@ -248,8 +257,7 @@
// ensure that asset has been delivered
await helper.wait.newBlocks(3);
- // expext collection id will be with id 1
- const free = await helper.ft.getBalance(1, {Substrate: alice.address});
+ const free = await helper.ft.getBalance(usdtCollectionId, {Substrate: alice.address});
balanceQuartzAfter = await helper.balance.getSubstrate(alice.address);
@@ -288,15 +296,11 @@
const relayFee = 400_000_000_000_000n;
const currencies: [any, bigint][] = [
[
- {
- ForeignAssetId: 0,
- },
+ usdtCollectionId,
TRANSFER_AMOUNT,
],
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
relayFee,
],
];
@@ -321,7 +325,7 @@
itSub('Should connect and send Relay token to Quartz', async ({helper}) => {
balanceBobBefore = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenBefore = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenBefore = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
await usingRelayPlaygrounds(relayUrl, async (helper) => {
const destination = {
@@ -369,7 +373,7 @@
await helper.wait.newBlocks(3);
balanceBobAfter = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenAfter = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenAfter = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
const wndFeeOnQuartz = balanceBobRelayTokenAfter - TRANSFER_AMOUNT_RELAY - balanceBobRelayTokenBefore;
const wndDiffOnQuartz = balanceBobRelayTokenAfter - balanceBobRelayTokenBefore;
@@ -409,9 +413,7 @@
const currencies: any = [
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
TRANSFER_AMOUNT_RELAY,
],
];
js-packages/tests/xcm/xcmUnique.test.tsdiffbeforeafterboth--- a/js-packages/tests/xcm/xcmUnique.test.ts
+++ b/js-packages/tests/xcm/xcmUnique.test.ts
@@ -20,7 +20,7 @@
import {Event} from '@unique/playgrounds/unique.dev.js';
import {hexToString, nToBigInt} from '@polkadot/util';
import {ACALA_CHAIN, ASTAR_CHAIN, MOONBEAM_CHAIN, POLKADEX_CHAIN, SAFE_XCM_VERSION, STATEMINT_CHAIN, UNIQUE_CHAIN, expectFailedToTransact, expectUntrustedReserveLocationFail, uniqueAssetId, uniqueVersionedMultilocation} from './xcm.types.js';
-
+import {XcmTestHelper} from './xcm.types';
const STATEMINT_PALLET_INSTANCE = 50;
@@ -50,6 +50,8 @@
const USDT_ASSET_METADATA_MINIMAL_BALANCE = 1n;
const USDT_ASSET_AMOUNT = 10_000_000_000_000_000_000_000_000n;
+const testHelper = new XcmTestHelper('unique');
+
describeXCM('[XCM] Integration test: Exchanging USDT with Statemint', () => {
let alice: IKeyringPair;
let bob: IKeyringPair;
@@ -68,6 +70,8 @@
let balanceBobRelayTokenBefore: bigint;
let balanceBobRelayTokenAfter: bigint;
+ let usdtCollectionId: number;
+ let relayCollectionId: number;
before(async () => {
await usingPlaygrounds(async (helper, privateKey) => {
@@ -76,6 +80,8 @@
// Set the default version to wrap the first message to other chains.
await helper.getSudo().xcm.setSafeXcmVersion(alice, SAFE_XCM_VERSION);
+
+ relayCollectionId = await testHelper.registerRelayNativeTokenOnUnique(alice);
});
await usingRelayPlaygrounds(relayUrl, async (helper) => {
@@ -85,21 +91,25 @@
});
await usingStatemintPlaygrounds(statemintUrl, async (helper) => {
- const sovereignFundingAmount = 3_500_000_000n;
+ const assetInfo = await helper.assets.assetInfo(USDT_ASSET_ID);
+ if(assetInfo == null) {
+ await helper.assets.create(
+ alice,
+ USDT_ASSET_ID,
+ alice.address,
+ USDT_ASSET_METADATA_MINIMAL_BALANCE,
+ );
+ await helper.assets.setMetadata(
+ alice,
+ USDT_ASSET_ID,
+ USDT_ASSET_METADATA_NAME,
+ USDT_ASSET_METADATA_DESCRIPTION,
+ USDT_ASSET_METADATA_DECIMALS,
+ );
+ } else {
+ console.log('The USDT asset is already registered on AssetHub');
+ }
- await helper.assets.create(
- alice,
- USDT_ASSET_ID,
- alice.address,
- USDT_ASSET_METADATA_MINIMAL_BALANCE,
- );
- await helper.assets.setMetadata(
- alice,
- USDT_ASSET_ID,
- USDT_ASSET_METADATA_NAME,
- USDT_ASSET_METADATA_DESCRIPTION,
- USDT_ASSET_METADATA_DECIMALS,
- );
await helper.assets.mint(
alice,
USDT_ASSET_ID,
@@ -107,6 +117,8 @@
USDT_ASSET_AMOUNT,
);
+ const sovereignFundingAmount = 3_500_000_000n;
+
// funding parachain sovereing account on Statemint.
// The sovereign account should be created before any action
// (the assets pallet on Statemint check if the sovereign account exists)
@@ -117,31 +129,29 @@
await usingPlaygrounds(async (helper) => {
const location = {
- V2: {
- parents: 1,
- interior: {X3: [
- {
- Parachain: STATEMINT_CHAIN,
- },
- {
- PalletInstance: STATEMINT_PALLET_INSTANCE,
- },
- {
- GeneralIndex: USDT_ASSET_ID,
- },
- ]},
- },
+ parents: 1,
+ interior: {X3: [
+ {
+ Parachain: STATEMINT_CHAIN,
+ },
+ {
+ PalletInstance: STATEMINT_PALLET_INSTANCE,
+ },
+ {
+ GeneralIndex: USDT_ASSET_ID,
+ },
+ ]},
};
- const metadata =
- {
- name: USDT_ASSET_ID,
- symbol: USDT_ASSET_METADATA_NAME,
- decimals: USDT_ASSET_METADATA_DECIMALS,
- minimalBalance: USDT_ASSET_METADATA_MINIMAL_BALANCE,
- };
- await helper.getSudo().foreignAssets.register(alice, alice.address, location, metadata);
+ if(await helper.foreignAssets.foreignCollectionId(location) == null) {
+ const tokenPrefix = USDT_ASSET_METADATA_NAME;
+ await helper.getSudo().foreignAssets.register(alice, location, USDT_ASSET_METADATA_NAME, tokenPrefix, {Fungible: USDT_ASSET_METADATA_DECIMALS});
+ } else {
+ console.log('Foreign collection is already registered on Unique');
+ }
+
balanceUniqueBefore = await helper.balance.getSubstrate(alice.address);
+ usdtCollectionId = await helper.foreignAssets.foreignCollectionId(location);
});
@@ -259,8 +269,7 @@
// ensure that asset has been delivered
await helper.wait.newBlocks(3);
- // expext collection id will be with id 1
- const free = await helper.ft.getBalance(1, {Substrate: alice.address});
+ const free = await helper.ft.getBalance(usdtCollectionId, {Substrate: alice.address});
balanceUniqueAfter = await helper.balance.getSubstrate(alice.address);
@@ -299,15 +308,11 @@
const relayFee = 400_000_000_000_000n;
const currencies: [any, bigint][] = [
[
- {
- ForeignAssetId: 0,
- },
+ usdtCollectionId,
TRANSFER_AMOUNT,
],
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
relayFee,
],
];
@@ -332,7 +337,7 @@
itSub('Should connect and send Relay token to Unique', async ({helper}) => {
balanceBobBefore = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenBefore = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenBefore = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
await usingRelayPlaygrounds(relayUrl, async (helper) => {
const destination = {
@@ -380,7 +385,7 @@
await helper.wait.newBlocks(3);
balanceBobAfter = await helper.balance.getSubstrate(bob.address);
- balanceBobRelayTokenAfter = await helper.tokens.accounts(bob.address, {NativeAssetId: 'Parent'});
+ balanceBobRelayTokenAfter = await helper.ft.getBalance(relayCollectionId, {Substrate: bob.address});
const wndFeeOnUnique = balanceBobRelayTokenAfter - TRANSFER_AMOUNT_RELAY - balanceBobRelayTokenBefore;
const wndDiffOnUnique = balanceBobRelayTokenAfter - balanceBobRelayTokenBefore;
@@ -420,9 +425,7 @@
const currencies: any = [
[
- {
- NativeAssetId: 'Parent',
- },
+ relayCollectionId,
TRANSFER_AMOUNT_RELAY,
],
];