difftreelog
Merge pull request #985 from UniqueNetwork/fix/xcm-release-60
in: master
4 files changed
.baedeker/xcm-quartz.jsonnetdiffbeforeafterboth--- a/.baedeker/xcm-quartz.jsonnet
+++ b/.baedeker/xcm-quartz.jsonnet
@@ -82,7 +82,7 @@
wantedKeys: 'para-nimbus',
legacyRpc: true,
},
- for name in ['alice', 'bob']
+ for name in ['alith', 'baltathar']
},
};
.baedeker/xcm-unique.jsonnetdiffbeforeafterboth1local2m = import 'baedeker-library/mixin/spec.libsonnet',3;45function(relay_spec)67local relay = {8 name: 'relay',9 bin: 'bin/polkadot',10 validatorIdAssignment: 'staking',11 spec: {Genesis:{12 chain: relay_spec,13 modify:: m.genericRelay($, hrmp = std.join([], [14 [[$.parachains[a].paraId, $.parachains[b].paraId, 8, 512], [$.parachains[b].paraId, $.parachains[a].paraId, 8, 512]],15 for [a, b] in [16 ['unique', 'acala'],17 ['unique', 'moonbeam'],18 ['unique', 'statemint'],19 ['unique', 'astar'],20 ['unique', 'polkadex'],21 ]22 ])),23 }},24 nodes: {25 [name]: {26 bin: $.bin,27 wantedKeys: 'relay',28 },29 for name in ['alice', 'bob', 'charlie', 'dave', 'eve', 'ferdie', 'gregory']30 },31};3233local unique = {34 name: 'unique',35 bin: 'bin/unique',36 paraId: 1001,37 spec: {Genesis:{38 modify:: m.genericPara($),39 }},40 nodes: {41 [name]: {42 bin: $.bin,43 wantedKeys: 'para',44 },45 for name in ['alice', 'bob']46 },47};4849local acala = {50 name: 'acala',51 bin: 'bin/acala',52 paraId: 1002,53 spec: {Genesis:{54 chain: 'acala-dev',55 modify:: bdk.mixer([56 m.genericPara($),57 function(prev) prev {id+: '-local'},58 ]),59 }},60 nodes: {61 [name]: {62 bin: $.bin,63 wantedKeys: 'para',64 legacyRpc: true,65 },66 for name in ['alice', 'bob']67 },68};6970local moonbeam = {71 name: 'moonbeam',72 bin: 'bin/moonbeam',73 signatureSchema: 'Ethereum',74 paraId: 1003,75 spec: {Genesis:{76 chain: 'moonbeam-local',77 specFilePrefix: 'moonbeam-local-',78 modify:: m.genericPara($),79 }},80 nodes: {81 [name]: {82 bin: $.bin,83 wantedKeys: 'para-nimbus',84 legacyRpc: true,85 },86 for name in ['alice', 'bob']87 },88};8990local statemint = {91 name: 'statemint',92 bin: 'bin/cumulus',93 paraId: 1004,94 spec: {Genesis:{95 chain: 'statemint-local',96 modify:: m.genericPara($),97 }},98 nodes: {99 [name]: {100 bin: $.bin,101 wantedKeys: 'para-ed',102 },103 for name in ['alice', 'bob']104 },105};106107local astar = {108 name: 'astar',109 bin: 'bin/astar',110 paraId: 1005,111 spec: {Genesis:{112 chain: 'astar-dev',113 modify:: m.genericPara($),114 }},115 nodes: {116 [name]: {117 bin: $.bin,118 wantedKeys: 'para',119 legacyRpc: true,120 },121 for name in ['alice', 'bob']122 },123};124125local polkadex = {126 name: 'polkadex',127 bin: 'bin/polkadex',128 paraId: 1006,129 spec: {Genesis:{130 chain: 'mainnet',131 modify:: m.genericPara($),132 }},133 nodes: {134 [name]: {135 bin: $.bin,136 wantedKeys: 'para',137 },138 for name in ['alice', 'bob']139 },140};141142relay + {143 parachains: {144 [para.name]: para,145 for para in [unique, acala, moonbeam, statemint, astar, polkadex]146 },147}tests/src/xcm/xcmQuartz.test.tsdiffbeforeafterboth--- a/tests/src/xcm/xcmQuartz.test.ts
+++ b/tests/src/xcm/xcmQuartz.test.ts
@@ -467,8 +467,9 @@
// 2 QTZ sent https://quartz.subscan.io/xcm_message/kusama-f60d821b049f8835a3005ce7102285006f5b61e9
// 1.919176000000000000 QTZ received (you can check Karura's chain state in the corresponding block)
const expectedKaruraIncomeFee = 2000000000000000000n - 1919176000000000000n;
+ const karuraEps = 8n * 10n ** 16n;
- const KARURA_BACKWARD_TRANSFER_AMOUNT = TRANSFER_AMOUNT - expectedKaruraIncomeFee;
+ let karuraBackwardTransferAmount: bigint;
before(async () => {
await usingPlaygrounds(async (helper, privateKey) => {
@@ -569,6 +570,8 @@
const karFees = balanceKaruraTokenInit - balanceKaruraTokenMiddle;
const qtzIncomeTransfer = balanceQuartzForeignTokenMiddle - balanceQuartzForeignTokenInit;
+ karuraBackwardTransferAmount = qtzIncomeTransfer;
+
const karUnqFees = TRANSFER_AMOUNT - qtzIncomeTransfer;
console.log(
@@ -581,8 +584,11 @@
);
console.log('[Quartz -> Karura] income %s QTZ', helper.util.bigIntToDecimals(qtzIncomeTransfer));
expect(karFees == 0n).to.be.true;
+
+ const bigintAbs = (n: bigint) => (n < 0n) ? -n : n;
+
expect(
- karUnqFees == expectedKaruraIncomeFee,
+ bigintAbs(karUnqFees - expectedKaruraIncomeFee) < karuraEps,
'Karura took different income fee, check the Karura foreign asset config',
).to.be.true;
});
@@ -611,7 +617,7 @@
ForeignAsset: 0,
};
- await helper.xTokens.transfer(randomAccount, id, KARURA_BACKWARD_TRANSFER_AMOUNT, destination, 'Unlimited');
+ await helper.xTokens.transfer(randomAccount, id, karuraBackwardTransferAmount, destination, 'Unlimited');
balanceKaruraTokenFinal = await helper.balance.getSubstrate(randomAccount.address);
balanceQuartzForeignTokenFinal = await helper.tokens.accounts(randomAccount.address, id);
@@ -625,7 +631,7 @@
console.log('[Karura -> Quartz] outcome %s QTZ', helper.util.bigIntToDecimals(qtzOutcomeTransfer));
expect(karFees > 0, 'Negative fees KAR, looks like nothing was transferred').to.be.true;
- expect(qtzOutcomeTransfer == KARURA_BACKWARD_TRANSFER_AMOUNT).to.be.true;
+ expect(qtzOutcomeTransfer == karuraBackwardTransferAmount).to.be.true;
});
await helper.wait.newBlocks(3);
@@ -636,7 +642,7 @@
console.log('[Karura -> Quartz] actually delivered %s QTZ', helper.util.bigIntToDecimals(actuallyDelivered));
- const qtzFees = KARURA_BACKWARD_TRANSFER_AMOUNT - actuallyDelivered;
+ const qtzFees = karuraBackwardTransferAmount - actuallyDelivered;
console.log('[Karura -> Quartz] transaction fees on Quartz: %s QTZ', helper.util.bigIntToDecimals(qtzFees));
expect(qtzFees == 0n).to.be.true;
});
@@ -673,7 +679,7 @@
);
let maliciousXcmProgramSent: any;
- const maxWaitBlocks = 3;
+ const maxWaitBlocks = 5;
// Try to trick Quartz
await usingKaruraPlaygrounds(karuraUrl, async (helper) => {
@@ -682,8 +688,10 @@
maliciousXcmProgramSent = await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.XcmpMessageSent);
});
- await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => {
+ return event.messageHash == maliciousXcmProgramSent.messageHash
+ && event.outcome.isFailedToTransactAsset;
+ });
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -764,7 +772,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -777,7 +785,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -853,7 +861,7 @@
const expectFailedToTransact = async (helper: DevUniqueHelper, messageSent: any) => {
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == messageSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
};
itSub('Quartz rejects KAR tokens from Karura', async ({helper}) => {
@@ -1165,7 +1173,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -1254,7 +1262,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1271,7 +1279,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1531,7 +1539,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -1612,7 +1620,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1625,7 +1633,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
tests/src/xcm/xcmUnique.test.tsdiffbeforeafterboth--- a/tests/src/xcm/xcmUnique.test.ts
+++ b/tests/src/xcm/xcmUnique.test.ts
@@ -84,9 +84,8 @@
await usingRelayPlaygrounds(relayUrl, async (helper) => {
// Fund accounts on Statemint
- const relayXcmVersion = 2;
- await helper.xcm.teleportNativeAsset(alice, STATEMINT_CHAIN, alice.addressRaw, FUNDING_AMOUNT, relayXcmVersion);
- await helper.xcm.teleportNativeAsset(alice, STATEMINT_CHAIN, bob.addressRaw, FUNDING_AMOUNT, relayXcmVersion);
+ await helper.xcm.teleportNativeAsset(alice, STATEMINT_CHAIN, alice.addressRaw, FUNDING_AMOUNT);
+ await helper.xcm.teleportNativeAsset(alice, STATEMINT_CHAIN, bob.addressRaw, FUNDING_AMOUNT);
});
await usingStatemintPlaygrounds(statemintUrl, async (helper) => {
@@ -154,7 +153,7 @@
// (fee for USDT XCM are paid in relay tokens)
await usingRelayPlaygrounds(relayUrl, async (helper) => {
const destination = {
- V1: {
+ V2: {
parents: 0,
interior: {X1: {
Parachain: UNIQUE_CHAIN,
@@ -163,7 +162,7 @@
}};
const beneficiary = {
- V1: {
+ V2: {
parents: 0,
interior: {X1: {
AccountId32: {
@@ -175,7 +174,7 @@
};
const assets = {
- V1: [
+ V2: [
{
id: {
Concrete: {
@@ -200,7 +199,7 @@
itSub('Should connect and send USDT from Statemint to Unique', async ({helper}) => {
await usingStatemintPlaygrounds(statemintUrl, async (helper) => {
const dest = {
- V1: {
+ V2: {
parents: 1,
interior: {X1: {
Parachain: UNIQUE_CHAIN,
@@ -209,7 +208,7 @@
}};
const beneficiary = {
- V1: {
+ V2: {
parents: 0,
interior: {X1: {
AccountId32: {
@@ -221,7 +220,7 @@
};
const assets = {
- V1: [
+ V2: [
{
id: {
Concrete: {
@@ -341,7 +340,7 @@
await usingRelayPlaygrounds(relayUrl, async (helper) => {
const destination = {
- V1: {
+ V2: {
parents: 0,
interior: {X1: {
Parachain: UNIQUE_CHAIN,
@@ -350,7 +349,7 @@
}};
const beneficiary = {
- V1: {
+ V2: {
parents: 0,
interior: {X1: {
AccountId32: {
@@ -362,7 +361,7 @@
};
const assets = {
- V1: [
+ V2: [
{
id: {
Concrete: {
@@ -468,8 +467,9 @@
// 2 UNQ sent https://unique.subscan.io/xcm_message/polkadot-bad0b68847e2398af25d482e9ee6f9c1f9ec2a48
// 1.898970000000000000 UNQ received (you can check Acala's chain state in the corresponding block)
const expectedAcalaIncomeFee = 2000000000000000000n - 1898970000000000000n;
+ const acalaEps = 8n * 10n ** 16n;
- const ACALA_BACKWARD_TRANSFER_AMOUNT = TRANSFER_AMOUNT - expectedAcalaIncomeFee;
+ let acalaBackwardTransferAmount: bigint;
before(async () => {
await usingPlaygrounds(async (helper, privateKey) => {
@@ -482,7 +482,7 @@
await usingAcalaPlaygrounds(acalaUrl, async (helper) => {
const destination = {
- V1: {
+ V2: {
parents: 1,
interior: {
X1: {
@@ -571,6 +571,8 @@
const acaFees = balanceAcalaTokenInit - balanceAcalaTokenMiddle;
const unqIncomeTransfer = balanceUniqueForeignTokenMiddle - balanceUniqueForeignTokenInit;
+ acalaBackwardTransferAmount = unqIncomeTransfer;
+
const acaUnqFees = TRANSFER_AMOUNT - unqIncomeTransfer;
console.log(
@@ -583,8 +585,11 @@
);
console.log('[Unique -> Acala] income %s UNQ', helper.util.bigIntToDecimals(unqIncomeTransfer));
expect(acaFees == 0n).to.be.true;
+
+ const bigintAbs = (n: bigint) => (n < 0n) ? -n : n;
+
expect(
- acaUnqFees == expectedAcalaIncomeFee,
+ bigintAbs(acaUnqFees - expectedAcalaIncomeFee) < acalaEps,
'Acala took different income fee, check the Acala foreign asset config',
).to.be.true;
});
@@ -593,7 +598,7 @@
itSub('Should connect to Acala and send UNQ back', async ({helper}) => {
await usingAcalaPlaygrounds(acalaUrl, async (helper) => {
const destination = {
- V1: {
+ V2: {
parents: 1,
interior: {
X2: [
@@ -613,7 +618,7 @@
ForeignAsset: 0,
};
- await helper.xTokens.transfer(randomAccount, id, ACALA_BACKWARD_TRANSFER_AMOUNT, destination, 'Unlimited');
+ await helper.xTokens.transfer(randomAccount, id, acalaBackwardTransferAmount, destination, 'Unlimited');
balanceAcalaTokenFinal = await helper.balance.getSubstrate(randomAccount.address);
balanceUniqueForeignTokenFinal = await helper.tokens.accounts(randomAccount.address, id);
@@ -627,7 +632,7 @@
console.log('[Acala -> Unique] outcome %s UNQ', helper.util.bigIntToDecimals(unqOutcomeTransfer));
expect(acaFees > 0, 'Negative fees ACA, looks like nothing was transferred').to.be.true;
- expect(unqOutcomeTransfer == ACALA_BACKWARD_TRANSFER_AMOUNT).to.be.true;
+ expect(unqOutcomeTransfer == acalaBackwardTransferAmount).to.be.true;
});
await helper.wait.newBlocks(3);
@@ -638,7 +643,7 @@
console.log('[Acala -> Unique] actually delivered %s UNQ', helper.util.bigIntToDecimals(actuallyDelivered));
- const unqFees = ACALA_BACKWARD_TRANSFER_AMOUNT - actuallyDelivered;
+ const unqFees = acalaBackwardTransferAmount - actuallyDelivered;
console.log('[Acala -> Unique] transaction fees on Unique: %s UNQ', helper.util.bigIntToDecimals(unqFees));
expect(unqFees == 0n).to.be.true;
});
@@ -655,7 +660,7 @@
const [targetAccount] = await helper.arrange.createAccounts([targetAccountBalance], alice);
const uniqueMultilocation = {
- V1: {
+ V2: {
parents: 1,
interior: {
X1: {Parachain: UNIQUE_CHAIN},
@@ -685,7 +690,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -718,7 +723,7 @@
const [targetAccount] = await helper.arrange.createAccounts([0n], alice);
const uniqueMultilocation = {
- V1: {
+ V2: {
parents: 1,
interior: {
X1: {
@@ -766,7 +771,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -779,7 +784,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -845,7 +850,7 @@
};
uniqueCombinedMultilocationAcala = {
- V1: {
+ V2: {
parents: 1,
interior: {
X2: [uniqueParachainJunction, uniqueAccountJunction],
@@ -865,7 +870,7 @@
const expectFailedToTransact = async (helper: DevUniqueHelper, messageSent: any) => {
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == messageSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
};
itSub('Unique rejects ACA tokens from Acala', async ({helper}) => {
@@ -1178,7 +1183,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -1267,7 +1272,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1284,7 +1289,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1543,7 +1548,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramSent.messageHash
- && event.outcome().isFailedToTransactAsset);
+ && event.outcome.isFailedToTransactAsset);
targetAccountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(targetAccountBalance).to.be.equal(0n);
@@ -1624,7 +1629,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramFullIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
let accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);
@@ -1637,7 +1642,7 @@
});
await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.Fail, event => event.messageHash == maliciousXcmProgramHereIdSent.messageHash
- && event.outcome().isUntrustedReserveLocation);
+ && event.outcome.isUntrustedReserveLocation);
accountBalance = await helper.balance.getSubstrate(targetAccount.address);
expect(accountBalance).to.be.equal(0n);