From 3350da11edde7163a7fb3672f80da86efcf2ac05 Mon Sep 17 00:00:00 2001 From: girazoki Date: Fri, 14 Apr 2023 10:48:58 +0200 Subject: [PATCH 1/4] Proof size of 0 for XCM --- runtime/moonbase/src/xcm_config.rs | 2 +- runtime/moonbeam/src/xcm_config.rs | 4 ++-- runtime/moonriver/src/xcm_config.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/runtime/moonbase/src/xcm_config.rs b/runtime/moonbase/src/xcm_config.rs index 3b079b21ee..953301d6a5 100644 --- a/runtime/moonbase/src/xcm_config.rs +++ b/runtime/moonbase/src/xcm_config.rs @@ -523,7 +523,7 @@ where parameter_types! { pub const BaseXcmWeight: Weight - = Weight::from_parts(200_000_000u64, xcm_primitives::DEFAULT_PROOF_SIZE); + = Weight::from_parts(200_000_000u64, 0); pub const MaxAssetsForTransfer: usize = 2; // This is how we are going to detect whether the asset is a Reserve asset // This however is the chain part only diff --git a/runtime/moonbeam/src/xcm_config.rs b/runtime/moonbeam/src/xcm_config.rs index ebdf45de9f..67e78a8d67 100644 --- a/runtime/moonbeam/src/xcm_config.rs +++ b/runtime/moonbeam/src/xcm_config.rs @@ -199,7 +199,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( parameter_types! { /// The amount of weight an XCM operation takes. This is safe overestimate. - pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, DEFAULT_PROOF_SIZE); + pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, 0); /// Maximum number of instructions in a single XCM fragment. A sanity check against /// weight caculations getting too crazy. pub MaxInstructions: u32 = 100; @@ -456,7 +456,7 @@ where } parameter_types! { - pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, DEFAULT_PROOF_SIZE); + pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, 0); pub const MaxAssetsForTransfer: usize = 2; // This is how we are going to detect whether the asset is a Reserve asset diff --git a/runtime/moonriver/src/xcm_config.rs b/runtime/moonriver/src/xcm_config.rs index 2bae886c4a..f517147117 100644 --- a/runtime/moonriver/src/xcm_config.rs +++ b/runtime/moonriver/src/xcm_config.rs @@ -209,7 +209,7 @@ pub type XcmOriginToTransactDispatchOrigin = ( parameter_types! { /// The amount of weight an XCM operation takes. This is safe overestimate. - pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, DEFAULT_PROOF_SIZE); + pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, 0); /// Maximum number of instructions in a single XCM fragment. A sanity check against /// weight caculations getting too crazy. pub MaxInstructions: u32 = 100; @@ -472,7 +472,7 @@ where } parameter_types! { - pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, DEFAULT_PROOF_SIZE); + pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, 0); pub const MaxAssetsForTransfer: usize = 2; // This is how we are going to detect whether the asset is a Reserve asset From 8e32ae118543b36af609a31973633f8134e820e6 Mon Sep 17 00:00:00 2001 From: girazoki Date: Fri, 14 Apr 2023 10:58:54 +0200 Subject: [PATCH 2/4] Remove unused imports --- runtime/moonbeam/src/xcm_config.rs | 3 +-- runtime/moonriver/src/xcm_config.rs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/runtime/moonbeam/src/xcm_config.rs b/runtime/moonbeam/src/xcm_config.rs index 67e78a8d67..8eb9aa97a7 100644 --- a/runtime/moonbeam/src/xcm_config.rs +++ b/runtime/moonbeam/src/xcm_config.rs @@ -50,8 +50,7 @@ use xcm_executor::traits::JustTry; use orml_xcm_support::MultiNativeAsset; use xcm_primitives::{ AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, - FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, - DEFAULT_PROOF_SIZE, + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact }; use parity_scale_codec::{Decode, Encode}; diff --git a/runtime/moonriver/src/xcm_config.rs b/runtime/moonriver/src/xcm_config.rs index f517147117..d83670ee24 100644 --- a/runtime/moonriver/src/xcm_config.rs +++ b/runtime/moonriver/src/xcm_config.rs @@ -50,8 +50,7 @@ use xcm_executor::traits::JustTry; use orml_xcm_support::MultiNativeAsset; use xcm_primitives::{ AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, - FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, - DEFAULT_PROOF_SIZE, + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact }; use parity_scale_codec::{Decode, Encode}; From c9cfec181bcf3c0058723d7fd1985c1b7f2a736b Mon Sep 17 00:00:00 2001 From: girazoki Date: Fri, 14 Apr 2023 11:01:55 +0200 Subject: [PATCH 3/4] FMT --- runtime/moonbeam/src/xcm_config.rs | 2 +- runtime/moonriver/src/xcm_config.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/moonbeam/src/xcm_config.rs b/runtime/moonbeam/src/xcm_config.rs index 8eb9aa97a7..868fafe3f7 100644 --- a/runtime/moonbeam/src/xcm_config.rs +++ b/runtime/moonbeam/src/xcm_config.rs @@ -50,7 +50,7 @@ use xcm_executor::traits::JustTry; use orml_xcm_support::MultiNativeAsset; use xcm_primitives::{ AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, - FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, }; use parity_scale_codec::{Decode, Encode}; diff --git a/runtime/moonriver/src/xcm_config.rs b/runtime/moonriver/src/xcm_config.rs index d83670ee24..bae213c980 100644 --- a/runtime/moonriver/src/xcm_config.rs +++ b/runtime/moonriver/src/xcm_config.rs @@ -50,7 +50,7 @@ use xcm_executor::traits::JustTry; use orml_xcm_support::MultiNativeAsset; use xcm_primitives::{ AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, - FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, }; use parity_scale_codec::{Decode, Encode}; From 73f2fdefcad0e0f91f90694f9d43a40a2962369f Mon Sep 17 00:00:00 2001 From: timbrinded <79199034+timbrinded@users.noreply.github.com> Date: Fri, 14 Apr 2023 12:00:27 +0100 Subject: [PATCH 4/4] added test --- .../tests/test-xcm/test-xcm-ver-conversion.ts | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 tests/tests/test-xcm/test-xcm-ver-conversion.ts diff --git a/tests/tests/test-xcm/test-xcm-ver-conversion.ts b/tests/tests/test-xcm/test-xcm-ver-conversion.ts new file mode 100644 index 0000000000..fd7caf245e --- /dev/null +++ b/tests/tests/test-xcm/test-xcm-ver-conversion.ts @@ -0,0 +1,189 @@ +import "@moonbeam-network/api-augment"; +import { KeyringPair } from "@polkadot/keyring/types"; +import { ParaId } from "@polkadot/types/interfaces"; +import { BN, u8aToHex } from "@polkadot/util"; +import { expect } from "chai"; +import { generateKeyringPair } from "../../util/accounts"; +import { + injectHrmpMessageAndSeal, + RawXcmMessage, + weightMessage, + XcmFragment, +} from "../../util/xcm"; +import { describeDevMoonbeam } from "../../util/setup-dev-tests"; +import { expectOk } from "../../util/expect"; + +const foreign_para_id = 2000; + +// TODO: Add more test case permutations +describeDevMoonbeam( + "XCM Moonbase: version compatibility", + (context) => { + let random: KeyringPair; + let paraId: ParaId; + let transferredBalance: bigint; + let sovereignAddress: string; + + before("Should send DEV to the parachain sovereign", async function () { + random = generateKeyringPair(); + paraId = context.polkadotApi.createType("ParaId", 2000) as any; + sovereignAddress = u8aToHex( + new Uint8Array([...new TextEncoder().encode("sibl"), ...paraId.toU8a()]) + ).padEnd(42, "0"); + + transferredBalance = 100000000000000n; + await expectOk( + context.createBlock( + context.polkadotApi.tx.balances.transfer(sovereignAddress, transferredBalance) + ) + ); + const balance = ( + (await context.polkadotApi.query.system.account(sovereignAddress)) as any + ).data.free.toBigInt(); + expect(balance).to.eq(transferredBalance); + }); + + it("Should execute v2 message", async function () { + const metadata = await context.polkadotApi.rpc.state.getMetadata(); + const balancesPalletIndex = (metadata.asLatest.toHuman().pallets as Array).find( + (pallet) => pallet.name === "Balances" + ).index; + + const xcmMessage = new XcmFragment({ + assets: [ + { + multilocation: { + parents: 0, + interior: { + X1: { PalletInstance: balancesPalletIndex }, + }, + }, + fungible: transferredBalance, + }, + ], + weight_limit: new BN(8000000000), + beneficiary: random.address, + }) + .withdraw_asset() + .clear_origin() + .buy_execution() + .deposit_asset() + .as_v2(); + + const chargedWeight = await weightMessage( + context, + context.polkadotApi.createType("XcmVersionedXcm", xcmMessage) as any + ); + + const chargedFee = chargedWeight * 50000n; + + await injectHrmpMessageAndSeal(context, foreign_para_id, { + type: "XcmVersionedXcm", + payload: xcmMessage, + } as RawXcmMessage); + + const balance = ( + (await context.polkadotApi.query.system.account(sovereignAddress)) as any + ).data.free.toBigInt(); + expect(balance.toString(), "Sovereign account not empty, transfer has failed").to.eq( + 0n.toString() + ); + + const randomBalance = ( + (await context.polkadotApi.query.system.account(random.address)) as any + ).data.free.toBigInt(); + const expectedRandomBalance = transferredBalance - chargedFee; + expect(randomBalance, "Balance not increased, transfer has failed").to.eq( + expectedRandomBalance + ); + }); + }, + "Legacy", + "moonbase" +); + +describeDevMoonbeam( + "XCM Moonriver: version compatibility", + (context) => { + let random: KeyringPair; + let paraId: ParaId; + let transferredBalance: bigint; + let sovereignAddress: string; + + before("Should send DEV to the parachain sovereign", async function () { + random = generateKeyringPair(); + paraId = context.polkadotApi.createType("ParaId", 2000) as any; + sovereignAddress = u8aToHex( + new Uint8Array([...new TextEncoder().encode("sibl"), ...paraId.toU8a()]) + ).padEnd(42, "0"); + + transferredBalance = 100000000000000n; + await expectOk( + context.createBlock( + context.polkadotApi.tx.balances.transfer(sovereignAddress, transferredBalance) + ) + ); + const balance = ( + (await context.polkadotApi.query.system.account(sovereignAddress)) as any + ).data.free.toBigInt(); + expect(balance).to.eq(transferredBalance); + }); + + it("Should execute v2 message", async function () { + const metadata = await context.polkadotApi.rpc.state.getMetadata(); + const balancesPalletIndex = (metadata.asLatest.toHuman().pallets as Array).find( + (pallet) => pallet.name === "Balances" + ).index; + + const xcmMessage = new XcmFragment({ + assets: [ + { + multilocation: { + parents: 0, + interior: { + X1: { PalletInstance: balancesPalletIndex }, + }, + }, + fungible: transferredBalance, + }, + ], + weight_limit: new BN(8000000000), + beneficiary: random.address, + }) + .withdraw_asset() + .clear_origin() + .buy_execution() + .deposit_asset() + .as_v2(); + + const chargedWeight = await weightMessage( + context, + context.polkadotApi.createType("XcmVersionedXcm", xcmMessage) as any + ); + + const chargedFee = chargedWeight * 50000n; + + await injectHrmpMessageAndSeal(context, foreign_para_id, { + type: "XcmVersionedXcm", + payload: xcmMessage, + } as RawXcmMessage); + + const balance = ( + (await context.polkadotApi.query.system.account(sovereignAddress)) as any + ).data.free.toBigInt(); + expect(balance.toString(), "Sovereign account not empty, transfer has failed").to.eq( + 0n.toString() + ); + + const randomBalance = ( + (await context.polkadotApi.query.system.account(random.address)) as any + ).data.free.toBigInt(); + const expectedRandomBalance = transferredBalance - chargedFee; + expect(randomBalance, "Balance not increased, transfer has failed").to.eq( + expectedRandomBalance + ); + }); + }, + "Legacy", + "moonriver" +);