difftreelog
feat(ci) xcm tests for hydraDx
in: master
14 files changed
.baedeker/rewrites.example.jsonnetdiffbeforeafterboth1local dotenv = {1local dotenv = {2 [std.splitLimit(line, "=", 2)[0]]: std.splitLimit(line, "=", 2)[1]2 [std.splitLimit(line, '=', 2)[0]]: std.splitLimit(line, '=', 2)[1]3 for line in std.split(importstr "../.env", "\n")3 for line in std.split(importstr '../.env', '\n')4 if line != ""4 if line != ''5 if std.member(line, "=")5 if std.member(line, '=')6};6};778function(prev, repoDir)8function(prev, repoDir)9(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({9 (import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({10 'bin/unique':'%s/target/release/unique-collator' % repoDir,10 'bin/unique': '%s/target/release/unique-collator' % repoDir,11 'bin/polkadot':{dockerImage:'uniquenetwork/builder-polkadot:%s' % dotenv.POLKADOT_MAINNET_BRANCH},11 'bin/polkadot': { dockerImage: 'uniquenetwork/builder-polkadot:%s' % dotenv.POLKADOT_MAINNET_BRANCH },12 'bin/acala':{dockerImage:'uniquenetwork/builder-acala:%s' % dotenv.ACALA_BUILD_BRANCH},12 'bin/acala': { dockerImage: 'uniquenetwork/builder-acala:%s' % dotenv.ACALA_BUILD_BRANCH },13 'bin/moonbeam':{dockerImage:'uniquenetwork/builder-moonbeam:%s' % dotenv.MOONBEAM_BUILD_BRANCH},13 'bin/moonbeam': { dockerImage: 'uniquenetwork/builder-moonbeam:%s' % dotenv.MOONBEAM_BUILD_BRANCH },14 'bin/cumulus':{dockerImage:'uniquenetwork/builder-cumulus:%s' % dotenv.STATEMINE_BUILD_BRANCH},14 'bin/cumulus': { dockerImage: 'uniquenetwork/builder-cumulus:%s' % dotenv.STATEMINE_BUILD_BRANCH },15 'bin/astar':{dockerImage:'uniquenetwork/builder-astar:%s' % dotenv.ASTAR_BUILD_BRANCH},15 'bin/astar': { dockerImage: 'uniquenetwork/builder-astar:%s' % dotenv.ASTAR_BUILD_BRANCH },16 'bin/polkadex':{dockerImage:'uniquenetwork/builder-polkadex:%s' % dotenv.POLKADEX_BUILD_BRANCH},16 'bin/polkadex': { dockerImage: 'uniquenetwork/builder-polkadex:%s' % dotenv.POLKADEX_BUILD_BRANCH },17 'bin/hydradx': { dockerImage: 'uniquenetwork/builder-hydraDx:%s' % dotenv.HYDRADX_BUILD_BRANCH },17})(prev)18 })(prev)1819.baedeker/xcm-opal.jsonnetdiffbeforeafterboth19 [name]: {19 [name]: {20 bin: $.bin,20 bin: $.bin,21 wantedKeys: 'relay',21 wantedKeys: 'relay',22 extraArgs: [23 "-lxcm=trace"24 ],22 },25 },23 for name in ['alice', 'bob', 'charlie', 'dave', 'eve']26 for name in ['alice', 'bob', 'charlie', 'dave', 'eve']24 },27 },35 [name]: {38 [name]: {36 bin: $.bin,39 bin: $.bin,37 wantedKeys: 'para',40 wantedKeys: 'para',41 extraArgs: [42 "-lxcm=trace"43 ],38 },44 },39 for name in ['alice', 'bob']45 for name in ['alice', 'bob']40 },46 },52 [name]: {58 [name]: {53 bin: $.bin,59 bin: $.bin,54 wantedKeys: 'para',60 wantedKeys: 'para',61 extraArgs: [62 "-lxcm=trace"63 ],55 },64 },56 for name in ['alice', 'bob']65 for name in ['alice', 'bob']57 },66 },.baedeker/xcm-quartz.jsonnetdiffbeforeafterboth24 [name]: {24 [name]: {25 bin: $.bin,25 bin: $.bin,26 wantedKeys: 'relay',26 wantedKeys: 'relay',27 extraArgs: [28 "-lxcm=trace"29 ],27 },30 },28 for name in ['alice', 'bob', 'charlie', 'dave', 'eve', 'ferdie']31 for name in ['alice', 'bob', 'charlie', 'dave', 'eve', 'ferdie']29 },32 },40 [name]: {43 [name]: {41 bin: $.bin,44 bin: $.bin,42 wantedKeys: 'para',45 wantedKeys: 'para',46 extraArgs: [47 "-lxcm=trace"48 ],43 },49 },44 for name in ['alice', 'bob']50 for name in ['alice', 'bob']45 },51 },60 [name]: {66 [name]: {61 bin: $.bin,67 bin: $.bin,62 wantedKeys: 'para',68 wantedKeys: 'para',69 extraArgs: [70 "-lxcm=trace"71 ],63 },72 },64 for name in ['alice', 'bob']73 for name in ['alice', 'bob']65 },74 },79 [name]: {88 [name]: {80 bin: $.bin,89 bin: $.bin,81 wantedKeys: 'para-nimbus',90 wantedKeys: 'para-nimbus',91 extraArgs: [92 "-lxcm=trace"93 ],82 },94 },83 for name in ['alith', 'baltathar']95 for name in ['alith', 'baltathar']84 },96 },96 [name]: {108 [name]: {97 bin: $.bin,109 bin: $.bin,98 wantedKeys: 'para',110 wantedKeys: 'para',111 extraArgs: [112 "-lxcm=trace"113 ],99 },114 },100 for name in ['alice', 'bob']115 for name in ['alice', 'bob']101 },116 },113 [name]: {128 [name]: {114 bin: $.bin,129 bin: $.bin,115 wantedKeys: 'para',130 wantedKeys: 'para',131 extraArgs: [132 "-lxcm=trace"133 ],116 },134 },117 for name in ['alice', 'bob']135 for name in ['alice', 'bob']118 },136 },.baedeker/xcm-unique.jsonnetdiffbeforeafterboth25 [name]: {25 [name]: {26 bin: $.bin,26 bin: $.bin,27 wantedKeys: 'relay',27 wantedKeys: 'relay',28 extraArgs: [29 "-lxcm=trace"30 ],28 },31 },29 for name in ['alice', 'bob', 'charlie', 'dave', 'eve', 'ferdie', 'gregory']32 for name in ['alice', 'bob', 'charlie', 'dave', 'eve', 'ferdie', 'gregory', 'holly']30 },33 },31};34};323541 [name]: {44 [name]: {42 bin: $.bin,45 bin: $.bin,43 wantedKeys: 'para',46 wantedKeys: 'para',47 extraArgs: [48 "-lxcm=trace"49 ],44 },50 },45 for name in ['alice', 'bob']51 for name in ['alice', 'bob']46 },52 },61 [name]: {67 [name]: {62 bin: $.bin,68 bin: $.bin,63 wantedKeys: 'para',69 wantedKeys: 'para',70 extraArgs: [71 "-lxcm=trace"72 ],64 },73 },65 for name in ['alice', 'bob']74 for name in ['alice', 'bob']66 },75 },80 [name]: {89 [name]: {81 bin: $.bin,90 bin: $.bin,82 wantedKeys: 'para-nimbus',91 wantedKeys: 'para-nimbus',92 extraArgs: [93 "-lxcm=trace"94 ],83 },95 },84 for name in ['alith', 'baltathar']96 for name in ['alith', 'baltathar']85 },97 },97 [name]: {109 [name]: {98 bin: $.bin,110 bin: $.bin,99 wantedKeys: 'para-ed',111 wantedKeys: 'para-ed',112 extraArgs: [113 "-lxcm=trace"114 ],100 },115 },101 for name in ['alice', 'bob']116 for name in ['alice', 'bob']102 },117 },114 [name]: {129 [name]: {115 bin: $.bin,130 bin: $.bin,116 wantedKeys: 'para',131 wantedKeys: 'para',132 extraArgs: [133 "-lxcm=trace"134 ],117 },135 },118 for name in ['alice', 'bob']136 for name in ['alice', 'bob']119 },137 },131 [name]: {149 [name]: {132 bin: $.bin,150 bin: $.bin,133 wantedKeys: 'para',151 wantedKeys: 'para',152 extraArgs: [153 "-lxcm=trace"154 ],134 },155 },135 for name in ['alice', 'bob']156 for name in ['alice', 'bob']136 },157 },137};158};138159160local hydraDx = {161 name: 'hydraDx',162 bin: 'bin/hydradx',163 paraId: 1007,164 spec: {Genesis:{165 chain: 'local',166 modify:: m.genericPara($),167 }},168 nodes: {169 [name]: {170 bin: $.bin,171 wantedKeys: 'para',172 legacyRpc: true,173 extraArgs: [174 "-lxcm=trace"175 ],176 },177 for name in ['alice', 'bob']178 },179};180181139relay + {182relay + {140 parachains: {183 parachains: {141 [para.name]: para,184 [para.name]: para,142 for para in [unique, acala, moonbeam, statemint, astar, polkadex]185 for para in [unique, acala, moonbeam, statemint, astar, polkadex, hydraDx]143 },186 },144}187}145188.envdiffbeforeafterboth12UNIQUE_MAINNET_BRANCH=release-v1001006312UNIQUE_MAINNET_BRANCH=release-v1001006313UNIQUE_REPLICA_FROM=wss://ws.unique.network:44313UNIQUE_REPLICA_FROM=wss://ws.unique.network:44314POLKADEX_BUILD_BRANCH=v1.1.014POLKADEX_BUILD_BRANCH=v1.1.01515HYDRADX_BUILD_BRANCH=v20.1.1161617KUSAMA_MAINNET_BRANCH=release-v1.0.017KUSAMA_MAINNET_BRANCH=release-v1.0.018STATEMINE_BUILD_BRANCH=release-parachains-v943018STATEMINE_BUILD_BRANCH=release-parachains-v9430.vscode/settings.jsondiffbeforeafterboth10 "SKIP_WASM_BUILD": "1"10 "SKIP_WASM_BUILD": "1"11 },11 },12 "rust-analyzer.cargo.features": ["runtime-benchmarks", "try-runtime"],12 "rust-analyzer.cargo.features": ["runtime-benchmarks", "try-runtime"],13 "solidity.packageDefaultDependenciesDirectory": "tests/node_modules"13 "solidity.packageDefaultDependenciesDirectory": "js-packages/node_modules"14}14}1515js-packages/.vscode/settings.jsondiffbeforeafterboth3 "RUN_GOV_TESTS": "1",3 "RUN_GOV_TESTS": "1",4 "RUN_XCM_TESTS": "1"4 "RUN_XCM_TESTS": "1"5 },5 },6 "mochaExplorer.files": "src/**/*.test.ts",6 "mochaExplorer.files": "tests/**/*.test.ts",7 "mochaExplorer.require": "ts-node/register",7 "mochaExplorer.require": "ts-node/register",8 "eslint.format.enable": true,8 "eslint.format.enable": true,9 "[javascript]": {9 "[javascript]": {js-packages/playgrounds/unique.dev.tsdiffbeforeafterboth17import type {FrameSystemEventRecord, StagingXcmV2TraitsError, StagingXcmV3TraitsOutcome} from '@polkadot/types/lookup';17import type {FrameSystemEventRecord, StagingXcmV2TraitsError, StagingXcmV3TraitsOutcome} from '@polkadot/types/lookup';18import type {SignerOptions, VoidFn} from '@polkadot/api/types';18import type {SignerOptions, VoidFn} from '@polkadot/api/types';19import {spawnSync} from 'child_process';19import {spawnSync} from 'child_process';20import {AcalaHelper, AstarHelper, MoonbeamHelper, PolkadexHelper, RelayHelper, WestmintHelper, ForeignAssetsGroup, XcmGroup, XTokensGroup, TokensGroup} from './unique.xcm.js';20import {AcalaHelper, AstarHelper, MoonbeamHelper, PolkadexHelper, RelayHelper, WestmintHelper, ForeignAssetsGroup, XcmGroup, XTokensGroup, TokensGroup, HydraDxHelper} from './unique.xcm.js';21import {CollectiveGroup, CollectiveMembershipGroup, DemocracyGroup, RankedCollectiveGroup, ReferendaGroup} from './unique.governance.js';21import {CollectiveGroup, CollectiveMembershipGroup, DemocracyGroup, RankedCollectiveGroup, ReferendaGroup} from './unique.governance.js';22import type {ICollectiveGroup, IFellowshipGroup} from './unique.governance.js';22import type {ICollectiveGroup, IFellowshipGroup} from './unique.governance.js';2323667 }667 }668}668}669670export class DevHydraDxHelper extends HydraDxHelper {671 wait: WaitGroup;672 fastDemocracy: HydraFastDemocracyGroup;673674 constructor(logger: { log: (msg: any, level: any) => void, level: any }, options: {[key: string]: any} = {}) {675 options.helperBase = options.helperBase ?? DevHydraDxHelper;676677 super(logger, options);678679 this.wait = new WaitGroup(this);680 this.fastDemocracy = new HydraFastDemocracyGroup(this);681 }682}669683670export class DevKaruraHelper extends DevAcalaHelper {}684export class DevKaruraHelper extends DevAcalaHelper {}6716851150 }1164 }1151}1165}11661167class HydraFastDemocracyGroup {1168 helper: DevHydraDxHelper;11691170 constructor(helper: DevHydraDxHelper) {1171 this.helper = helper;1172 }11731174 async executeProposal(proposalDesciption: string, encodedProposal: string) {1175 const proposalHash = blake2AsHex(encodedProposal);1176 const aliceAccount = this.helper.util.fromSeed('//Alice');1177 const bobAccount = this.helper.util.fromSeed('//Bob');1178 const eveAccount = this.helper.util.fromSeed('//Eve');11791180 const councilVotingThreshold = 1;1181 const technicalCommitteeThreshold = 3;1182 const fastTrackVotingPeriod = 3;1183 const fastTrackDelayPeriod = 0;11841185 console.log(`[democracy] executing '${proposalDesciption}' proposal`);11861187 // >>> Propose external motion through council >>>1188 console.log('\t* Propose external motion through council.......');1189 const externalMotion = this.helper.democracy.externalProposeMajority({Inline: encodedProposal});1190 const encodedMotion = externalMotion?.method.toHex() || '';1191 const motionHash = blake2AsHex(encodedMotion);1192 console.log('\t* Motion hash is %s', motionHash);11931194 await this.helper.collective.council.propose(1195 aliceAccount,1196 councilVotingThreshold,1197 externalMotion,1198 externalMotion.encodedLength,1199 );12001201 // const councilProposalIdx = await this.helper.collective.council.proposalCount() - 1;1202 // await this.helper.collective.council.vote(aliceAccount, motionHash, councilProposalIdx, true);120312041205 // await this.helper.collective.council.close(1206 // aliceAccount,1207 // motionHash,1208 // councilProposalIdx,1209 // {1210 // refTime: 1_000_000_000,1211 // proofSize: 1_000_000,1212 // },1213 // externalMotion.encodedLength,1214 // );1215 console.log('\t* Propose external motion through council.......DONE');1216 // <<< Propose external motion through council <<<12171218 // >>> Fast track proposal through technical committee >>>1219 console.log('\t* Fast track proposal through technical committee.......');1220 const fastTrack = this.helper.democracy.fastTrack(proposalHash, fastTrackVotingPeriod, fastTrackDelayPeriod);1221 const encodedFastTrack = fastTrack?.method.toHex() || '';1222 const fastTrackHash = blake2AsHex(encodedFastTrack);1223 console.log('\t* FastTrack hash is %s', fastTrackHash);12241225 await this.helper.collective.techCommittee.propose(aliceAccount, technicalCommitteeThreshold, fastTrack, fastTrack.encodedLength);12261227 const techProposalIdx = await this.helper.collective.techCommittee.proposalCount() - 1;1228 await this.helper.collective.techCommittee.vote(aliceAccount, fastTrackHash, techProposalIdx, true);1229 await this.helper.collective.techCommittee.vote(bobAccount, fastTrackHash, techProposalIdx, true);1230 await this.helper.collective.techCommittee.vote(eveAccount, fastTrackHash, techProposalIdx, true);12311232 await this.helper.collective.techCommittee.close(1233 bobAccount,1234 fastTrackHash,1235 techProposalIdx,1236 {1237 refTime: 1_000_000_000,1238 proofSize: 1_000_000,1239 },1240 fastTrack.encodedLength,1241 );1242 console.log('\t* Fast track proposal through technical committee.......DONE');1243 // <<< Fast track proposal through technical committee <<<12441245 const democracyStarted = await this.helper.wait.expectEvent(3, Event.Democracy.Started);1246 const referendumIndex = democracyStarted.referendumIndex;12471248 // >>> Referendum voting >>>1249 console.log(`\t* Referendum #${referendumIndex} voting.......`);1250 await this.helper.democracy.referendumVote(eveAccount, referendumIndex, {1251 balance: 10_000_000_000_000_000_000n,1252 vote: {aye: true, conviction: 1},1253 });1254 console.log(`\t* Referendum #${referendumIndex} voting.......DONE`);1255 // <<< Referendum voting <<<12561257 // Wait the proposal to pass1258 await this.helper.wait.expectEvent(3, Event.Democracy.Passed, event => event.referendumIndex == referendumIndex);12591260 await this.helper.wait.newBlocks(1);12611262 console.log(`[democracy] executing '${proposalDesciption}' proposal.......DONE`);1263 }1264}115212651153class WaitGroup {1266class WaitGroup {1154 helper: ChainHelperBase;1267 helper: ChainHelperBase;js-packages/playgrounds/unique.xcm.tsdiffbeforeafterboth71 }71 }72}72}7374class DemocracyGroup<T extends ChainHelperBase> extends HelperGroup<T> {75 notePreimagePallet: string;7677 constructor(helper: T, options: { [key: string]: any } = {}) {78 super(helper);79 this.notePreimagePallet = options.notePreimagePallet;80 }8182 async notePreimage(signer: TSigner, encodedProposal: string) {83 await this.helper.executeExtrinsic(signer, `api.tx.${this.notePreimagePallet}.notePreimage`, [encodedProposal], true);84 }8586 externalProposeMajority(proposal: any) {87 return this.helper.constructApiCall('api.tx.democracy.externalProposeMajority', [proposal]);88 }8990 fastTrack(proposalHash: string, votingPeriod: number, delayPeriod: number) {91 return this.helper.constructApiCall('api.tx.democracy.fastTrack', [proposalHash, votingPeriod, delayPeriod]);92 }9394 async referendumVote(signer: TSigner, referendumIndex: number, accountVote: DemocracyStandardAccountVote) {95 await this.helper.executeExtrinsic(signer, 'api.tx.democracy.vote', [referendumIndex, {Standard: accountVote}], true);96 }97}739874class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {99class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {75 collective: string;100 collective: string;97 }122 }98}123}99124125class CollectiveGroup<T extends ChainHelperBase> extends HelperGroup<T> {126 collective: string;127128 constructor(helper: T, palletName: string) {129 super(helper);130131 this.collective = palletName;132 }133134 async propose(signer: TSigner, threshold: number, proposalHash: string, lengthBound: number) {135 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.propose`, [threshold, proposalHash, lengthBound], true);136 }137138 async vote(signer: TSigner, proposalHash: string, proposalIndex: number, approve: boolean) {139 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.vote`, [proposalHash, proposalIndex, approve], true);140 }141142 async close(signer: TSigner, proposalHash: string, proposalIndex: number, weightBound: any, lengthBound: number) {143 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.close`, [proposalHash, proposalIndex, weightBound, lengthBound], true);144 }145146 async proposalCount() {147 return Number(await this.helper.callRpc(`api.query.${this.collective}.proposalCount`, []));148 }149}100class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {150class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {101 async whitelistToken(signer: TSigner, assetId: any) {151 async whitelistToken(signer: TSigner, assetId: any) {102 await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);152 await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);372 }422 }373}423}424425export class HydraDxHelper extends XcmChainHelper {426 balance: SubstrateBalanceGroup<HydraDxHelper>;427 xcm: XcmGroup<HydraDxHelper>;428 xTokens: XTokensGroup<HydraDxHelper>;429 democracy: DemocracyGroup<HydraDxHelper>;430 collective: {431 council: CollectiveGroup<HydraDxHelper>,432 techCommittee: CollectiveGroup<HydraDxHelper>,433 };434435 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {436 super(logger, options.helperBase ?? HydraDxHelper);437 options.notePreimagePallet = options.notePreimagePallet ?? 'preimage';438439 this.balance = new SubstrateBalanceGroup(this);440 this.xcm = new XcmGroup(this, 'polkadotXcm');441 this.xTokens = new XTokensGroup(this);442 this.democracy = new DemocracyGroup(this, options);443 this.collective = {444 council: new CollectiveGroup(this, 'council'),445 techCommittee: new CollectiveGroup(this, 'technicalCommittee'),446 };447 }448}374449375450js-packages/tests/config.tsdiffbeforeafterboth29 statemineUrl: process.env.RELAY_STATEMINE_URL || 'ws://127.0.0.1:9948',29 statemineUrl: process.env.RELAY_STATEMINE_URL || 'ws://127.0.0.1:9948',30 statemintUrl: process.env.RELAY_STATEMINT_URL || 'ws://127.0.0.1:9948',30 statemintUrl: process.env.RELAY_STATEMINT_URL || 'ws://127.0.0.1:9948',31 polkadexUrl: process.env.RELAY_POLKADEX_URL || 'ws://127.0.0.1:9950',31 polkadexUrl: process.env.RELAY_POLKADEX_URL || 'ws://127.0.0.1:9950',32 hydraDxUrl: process.env.RELAY_HYDRADX_URL || 'ws://127.0.0.1:9951',32};33};333434export default config;35export default config;js-packages/tests/util/createHrmp.tsdiffbeforeafterboth27 await bidirOpen(1001, 1004);27 await bidirOpen(1001, 1004);28 await bidirOpen(1001, 1005);28 await bidirOpen(1001, 1005);29 await bidirOpen(1001, 1006);29 await bidirOpen(1001, 1006);30 await bidirOpen(1001, 1007);30 break;31 break;31 default:32 default:32 throw new Error(`unknown hrmp config profile: ${profile}`);33 throw new Error(`unknown hrmp config profile: ${profile}`);js-packages/tests/util/index.tsdiffbeforeafterboth11import config from '../config.js';11import config from '../config.js';12import {ChainHelperBase} from '@unique/playgrounds/unique.js';12import {ChainHelperBase} from '@unique/playgrounds/unique.js';13import type {ILogger} from '@unique/playgrounds/types.js';13import type {ILogger} from '@unique/playgrounds/types.js';14import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper, DevStatemineHelper, DevStatemintHelper, DevAstarHelper, DevShidenHelper, DevPolkadexHelper} from '@unique/playgrounds/unique.dev.js';14import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper, DevStatemineHelper, DevStatemintHelper, DevAstarHelper, DevShidenHelper, DevPolkadexHelper, DevHydraDxHelper} from '@unique/playgrounds/unique.dev.js';15import {dirname} from 'path';15import {dirname} from 'path';16import {fileURLToPath} from 'url';16import {fileURLToPath} from 'url';1717919192export const usingPolkadexPlaygrounds = (url: string, code: (helper: DevPolkadexHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => usingPlaygroundsGeneral<DevPolkadexHelper>(DevPolkadexHelper, url, code);92export const usingPolkadexPlaygrounds = (url: string, code: (helper: DevPolkadexHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => usingPlaygroundsGeneral<DevPolkadexHelper>(DevPolkadexHelper, url, code);9394export const usingHydraDxPlaygrounds = (url: string, code: (helper: DevHydraDxHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => usingPlaygroundsGeneral<DevHydraDxHelper>(DevHydraDxHelper, url, code);939594export const MINIMUM_DONOR_FUND = 4_000_000n;96export const MINIMUM_DONOR_FUND = 4_000_000n;95export const DONOR_FUNDING = 4_000_000n;97export const DONOR_FUNDING = 4_000_000n;js-packages/tests/xcm/lowLevelXcmUnique.test.tsdiffbeforeafterboth161617import type {IKeyringPair} from '@polkadot/types/types';17import type {IKeyringPair} from '@polkadot/types/types';18import config from '../config.js';18import config from '../config.js';19import {itSub, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingMoonbeamPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds} from '../util/index.js';19import {itSub, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingMoonbeamPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds, usingHydraDxPlaygrounds} from '../util/index.js';20import {nToBigInt} from '@polkadot/util';20import {nToBigInt} from '@polkadot/util';21import {hexToString} from '@polkadot/util';21import {hexToString} from '@polkadot/util';22import {ASTAR_DECIMALS, SAFE_XCM_VERSION, SENDER_BUDGET, UNIQUE_CHAIN, UNQ_DECIMALS, XcmTestHelper, acalaUrl, astarUrl, moonbeamUrl, polkadexUrl, relayUrl, uniqueAssetId} from './xcm.types.js';22import {ASTAR_DECIMALS, SAFE_XCM_VERSION, SENDER_BUDGET, UNIQUE_CHAIN, UNQ_DECIMALS, XcmTestHelper, acalaUrl, astarUrl, hydraDxUrl, moonbeamUrl, polkadexUrl, uniqueAssetId} from './xcm.types.js';232324const testHelper = new XcmTestHelper('unique');24const testHelper = new XcmTestHelper('unique');2525365 });365 });366});366});367367368describeXCM('[XCMLL] Integration test: Exchanging tokens with HydraDx', () => {369 let alice: IKeyringPair;370 let randomAccount: IKeyringPair;371372 before(async () => {373 await usingPlaygrounds(async (helper, privateKey) => {374 alice = await privateKey('//Alice');375 console.log(config.acalaUrl);376 randomAccount = helper.arrange.createEmptyAccount();377378 // Set the default version to wrap the first message to other chains.379 await helper.getSudo().xcm.setSafeXcmVersion(alice, SAFE_XCM_VERSION);380 await helper.balance.transferToSubstrate(alice, randomAccount.address, SENDER_BUDGET);381 });382383 await usingHydraDxPlaygrounds(hydraDxUrl, async (helper) => {384 await helper.balance.transferToSubstrate(alice, randomAccount.address, 10000000000000n);385 });386 });387388 itSub('Should connect and send UNQ to HydraDx', async () => {389 await testHelper.sendUnqTo('hydraDx', randomAccount);390 });391392 itSub('Should connect to HydraDx and send UNQ back', async () => {393 await testHelper.sendUnqBack('hydraDx', alice, randomAccount);394 });395396 itSub('HydraDx can send only up to its balance', async () => {397 await testHelper.sendOnlyOwnedBalance('hydraDx', alice);398 });399400 itSub('Should not accept reserve transfer of UNQ from HydraDx', async () => {401 await testHelper.rejectReserveTransferUNQfrom('hydraDx', alice);402 });403});js-packages/tests/xcm/xcm.types.tsdiffbeforeafterboth1import type {IKeyringPair} from '@polkadot/types/types';1import type {IKeyringPair} from '@polkadot/types/types';2import {hexToString} from '@polkadot/util';2import {hexToString} from '@polkadot/util';3import {expect, usingAcalaPlaygrounds, usingAstarPlaygrounds, usingKaruraPlaygrounds, usingMoonbeamPlaygrounds, usingMoonriverPlaygrounds, usingPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds, usingShidenPlaygrounds} from '../util/index.js';3import {expect, usingAcalaPlaygrounds, usingAstarPlaygrounds, usingHydraDxPlaygrounds, usingKaruraPlaygrounds, usingMoonbeamPlaygrounds, usingMoonriverPlaygrounds, usingPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds, usingShidenPlaygrounds} from '../util/index.js';4import {DevUniqueHelper, Event} from '@unique/playgrounds/unique.dev.js';4import {DevUniqueHelper, Event} from '@unique/playgrounds/unique.dev.js';5import config from '../config.js';5import config from '../config.js';6610export const MOONBEAM_CHAIN = +(process.env.RELAY_MOONBEAM_ID || 2004);10export const MOONBEAM_CHAIN = +(process.env.RELAY_MOONBEAM_ID || 2004);11export const ASTAR_CHAIN = +(process.env.RELAY_ASTAR_ID || 2006);11export const ASTAR_CHAIN = +(process.env.RELAY_ASTAR_ID || 2006);12export const POLKADEX_CHAIN = +(process.env.RELAY_POLKADEX_ID || 2040);12export const POLKADEX_CHAIN = +(process.env.RELAY_POLKADEX_ID || 2040);13export const HYDRADX_CHAIN = +(process.env.RELAY_HYDRADX_ID || 2034);131414export const QUARTZ_CHAIN = +(process.env.RELAY_QUARTZ_ID || 2095);15export const QUARTZ_CHAIN = +(process.env.RELAY_QUARTZ_ID || 2095);15export const STATEMINE_CHAIN = +(process.env.RELAY_STATEMINE_ID || 1000);16export const STATEMINE_CHAIN = +(process.env.RELAY_STATEMINE_ID || 1000);25export const moonbeamUrl = config.moonbeamUrl;26export const moonbeamUrl = config.moonbeamUrl;26export const astarUrl = config.astarUrl;27export const astarUrl = config.astarUrl;27export const polkadexUrl = config.polkadexUrl;28export const polkadexUrl = config.polkadexUrl;29export const hydraDxUrl = config.hydraDxUrl;283029export const karuraUrl = config.karuraUrl;31export const karuraUrl = config.karuraUrl;30export const moonriverUrl = config.moonriverUrl;32export const moonriverUrl = config.moonriverUrl;87 moonriver: usingMoonriverPlaygrounds,89 moonriver: usingMoonriverPlaygrounds,88 karura: usingKaruraPlaygrounds,90 karura: usingKaruraPlaygrounds,89 shiden: usingShidenPlaygrounds,91 shiden: usingShidenPlaygrounds,92 hydraDx: usingHydraDxPlaygrounds,90} as const;93} as const;91type NetworkNames = keyof typeof NETWORKS;94type NetworkNames = keyof typeof NETWORKS;9295108 return KARURA_CHAIN;111 return KARURA_CHAIN;109 case 'shiden':112 case 'shiden':110 return SHIDEN_CHAIN;113 return SHIDEN_CHAIN;114 case 'hydraDx':115 return HYDRADX_CHAIN;111 }116 }112}117}113118127 return karuraUrl;132 return karuraUrl;128 case 'shiden':133 case 'shiden':129 return shidenUrl;134 return shidenUrl;135 case 'hydraDx':136 return hydraDxUrl;130 }137 }131}138}132139277 since the hash is being checked to ensure284 since the hash is being checked to ensure278 it matches what was sent.285 it matches what was sent.279 */286 */280 if(networkName == 'polkadex') {287 if(networkName == 'polkadex' || networkName =='hydraDx') {281 await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == messageSent.messageHash);288 await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == messageSent.messageHash);282 } else {289 } else {283 await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Success, event => event.messageHash == messageSent.messageHash);290 await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Success, event => event.messageHash == messageSent.messageHash);