Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into tarekkma/staking-ad…
Browse files Browse the repository at this point in the history
…d-address-2
  • Loading branch information
TarekkMA committed Oct 3, 2024
2 parents fdae04b + 1c9dca4 commit b8eb6c4
Show file tree
Hide file tree
Showing 10 changed files with 284 additions and 3 deletions.
1 change: 1 addition & 0 deletions runtime/common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ runtime-benchmarks = [
"pallet-xcm/runtime-benchmarks",
"pallet-moonbeam-lazy-migrations/runtime-benchmarks",
"moonbeam-xcm-benchmarks/runtime-benchmarks",
"xcm-runtime-apis/runtime-benchmarks",
]
try-runtime = [
"cumulus-pallet-parachain-system/try-runtime",
Expand Down
37 changes: 37 additions & 0 deletions runtime/common/src/apis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,43 @@ macro_rules! impl_runtime_apis_plus_common {
}
}

impl xcm_runtime_apis::dry_run::DryRunApi<Block, RuntimeCall, RuntimeEvent, OriginCaller>
for Runtime {
fn dry_run_call(
origin: OriginCaller,
call: RuntimeCall
) -> Result<CallDryRunEffects<RuntimeEvent>, XcmDryRunApiError> {
PolkadotXcm::dry_run_call::<
Runtime,
xcm_config::XcmRouter,
OriginCaller,
RuntimeCall>(origin, call)
}

fn dry_run_xcm(
origin_location: VersionedLocation,
xcm: VersionedXcm<RuntimeCall>
) -> Result<XcmDryRunEffects<RuntimeEvent>, XcmDryRunApiError> {
PolkadotXcm::dry_run_xcm::<
Runtime,
xcm_config::XcmRouter,
RuntimeCall,
xcm_config::XcmExecutorConfig>(origin_location, xcm)
}
}

impl xcm_runtime_apis::conversions::LocationToAccountApi<Block, AccountId> for Runtime {
fn convert_location(location: VersionedLocation) -> Result<
AccountId,
xcm_runtime_apis::conversions::Error
> {
xcm_runtime_apis::conversions::LocationToAccountHelper::<
AccountId,
xcm_config::LocationToAccountId,
>::convert_location(location)
}
}

#[cfg(feature = "runtime-benchmarks")]
impl frame_benchmarking::Benchmark<Block> for Runtime {

Expand Down
1 change: 1 addition & 0 deletions runtime/moonbase/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ runtime-benchmarks = [
"session-keys-primitives/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
"xcm-builder/runtime-benchmarks",
"xcm-runtime-apis/runtime-benchmarks",
]

try-runtime = [
Expand Down
5 changes: 4 additions & 1 deletion runtime/moonbase/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,10 @@ use sp_std::{
use sp_version::NativeVersion;
use sp_version::RuntimeVersion;
use xcm::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm};
use xcm_runtime_apis::fees::Error as XcmPaymentApiError;
use xcm_runtime_apis::{
dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects},
fees::Error as XcmPaymentApiError,
};

use smallvec::smallvec;
use sp_runtime::serde::{Deserialize, Serialize};
Expand Down
1 change: 1 addition & 0 deletions runtime/moonbeam/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,7 @@ runtime-benchmarks = [
"session-keys-primitives/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
"xcm-builder/runtime-benchmarks",
"xcm-runtime-apis/runtime-benchmarks",
]

try-runtime = [
Expand Down
5 changes: 4 additions & 1 deletion runtime/moonbeam/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ use sp_runtime::{
};
use sp_std::{convert::TryFrom, prelude::*};
use xcm::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm};
use xcm_runtime_apis::fees::Error as XcmPaymentApiError;
use xcm_runtime_apis::{
dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects},
fees::Error as XcmPaymentApiError,
};

#[cfg(feature = "std")]
use sp_version::NativeVersion;
Expand Down
1 change: 1 addition & 0 deletions runtime/moonriver/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ runtime-benchmarks = [
"session-keys-primitives/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
"xcm-builder/runtime-benchmarks",
"xcm-runtime-apis/runtime-benchmarks",
]
try-runtime = [
"cumulus-pallet-parachain-system/try-runtime",
Expand Down
5 changes: 4 additions & 1 deletion runtime/moonriver/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ use sp_runtime::{
};
use sp_std::{convert::TryFrom, prelude::*};
use xcm::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm};
use xcm_runtime_apis::fees::Error as XcmPaymentApiError;
use xcm_runtime_apis::{
dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects},
fees::Error as XcmPaymentApiError,
};

use smallvec::smallvec;
#[cfg(feature = "std")]
Expand Down
209 changes: 209 additions & 0 deletions test/suites/dev/moonbase/test-xcm-v4/test-xcm-dry-run-api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
import { beforeAll, describeSuite, expect } from "@moonwall/cli";
import { alith, generateKeyringPair } from "@moonwall/util";
import { ApiPromise, WsProvider } from "@polkadot/api";
import { u8aToHex } from "@polkadot/util";
import { XcmFragment } from "../../../../helpers";

// TODO: remove once the api is present in @polkadot/api
const runtimeApi = {
runtime: {
DryRunApi: [
{
methods: {
dry_run_call: {
description: "Dry run call",
params: [
{
name: "origin",
type: "OriginCaller",
},
{
name: "call",
type: "Call",
},
],
type: "Result<CallDryRunEffects<Event>, XcmDryRunError>",
},
dry_run_xcm: {
description: "Dry run XCM program",
params: [
{
name: "origin_location",
type: "XcmVersionedLocation",
},
{
name: "xcm",
type: "XcmVersionedXcm",
},
],
type: "Result<XcmDryRunEffects, XcmDryRunError>",
},
},
version: 1,
},
],
},
types: {
CallDryRunEffects: {
ExecutionResult: "DispatchResultWithPostInfo",
EmittedEvents: "Vec<Event>",
LocalXcm: "Option<XcmVersionedXcm>",
ForwardedXcms: "Vec<(XcmVersionedLocation, Vec<XcmVersionedXcm>)>",
},
DispatchErrorWithPostInfoTPostDispatchInfo: {
postInfo: "PostDispatchInfo",
error: "DispatchError",
},
DispatchResultWithPostInfo: {
_enum: {
Ok: "PostDispatchInfo",
Err: "DispatchErrorWithPostInfoTPostDispatchInfo",
},
},
PostDispatchInfo: {
actualWeight: "Option<Weight>",
paysFee: "Pays",
},
XcmDryRunEffects: {
ExecutionResult: "StagingXcmV4TraitsOutcome",
EmittedEvents: "Vec<Event>",
ForwardedXcms: "Vec<(XcmVersionedLocation, Vec<XcmVersionedXcm>)>",
},
XcmDryRunError: {
_enum: {
Unimplemented: "Null",
VersionedConversionFailed: "Null",
},
},
},
};

describeSuite({
id: "D014135",
title: "XCM - DryRunApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
let polkadotJs: ApiPromise;

beforeAll(async function () {
polkadotJs = await ApiPromise.create({
provider: new WsProvider(`ws://localhost:${process.env.MOONWALL_RPC_PORT}/`),
...runtimeApi,
});
});

it({
id: "T01",
title: "Should succeed calling DryRunApi::dryRunCall",
test: async function () {
const metadata = await context.polkadotJs().rpc.state.getMetadata();
const balancesPalletIndex = metadata.asLatest.pallets
.find(({ name }) => name.toString() == "Balances")!
.index.toNumber();

const randomReceiver = "0x1111111111111111111111111111111111111111111111111111111111111111";

// Beneficiary from destination's point of view
const destBeneficiary = {
V3: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: null,
id: randomReceiver,
},
},
},
},
};

const assetsToSend = {
V3: [
{
id: {
Concrete: {
parents: 0,
interior: {
X1: { PalletInstance: Number(balancesPalletIndex) },
},
},
},
fun: {
Fungible: 1_000_000_000_000_000n,
},
},
],
};
const dest = {
V3: {
parents: 1,
interior: {
Here: null,
},
},
};
const polkadotXcmTx = polkadotJs.tx.polkadotXcm.transferAssets(
dest,
destBeneficiary,
assetsToSend,
0,
"Unlimited"
);

const dryRunCall = await polkadotJs.call.dryRunApi.dryRunCall(
{ system: { signed: alith.address } },
polkadotXcmTx
);

expect(dryRunCall.isOk).to.be.true;
expect(dryRunCall.asOk.ExecutionResult.isOk).be.true;
},
});

it({
id: "T02",
title: "Should succeed calling DryRunApi::dryRunXcm",
test: async function () {
const metadata = await context.polkadotJs().rpc.state.getMetadata();
const balancesPalletIndex = metadata.asLatest.pallets
.find(({ name }) => name.toString() == "Balances")!
.index.toNumber();
const randomKeyPair = generateKeyringPair();

// We will dry run a "ReserveAssetDeposited" coming from the relay
const xcmMessage = new XcmFragment({
assets: [
{
multilocation: {
parents: 0,
interior: {
X1: { PalletInstance: Number(balancesPalletIndex) },
},
},
fungible: 1_000_000_000_000_000n,
},
],
beneficiary: u8aToHex(randomKeyPair.addressRaw),
})
.reserve_asset_deposited()
.clear_origin()
.buy_execution()
.deposit_asset_v3()
.as_v3();

const dryRunXcm = await polkadotJs.call.dryRunApi.dryRunXcm(
{
V3: {
Concrete: { parent: 1, interior: { Here: null } },
},
},
xcmMessage
);

expect(dryRunXcm.isOk).to.be.true;
expect(dryRunXcm.asOk.ExecutionResult.isComplete).be.true;
},
});
},
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { describeSuite, expect } from "@moonwall/cli";
import { RELAY_V3_SOURCE_LOCATION } from "../../../../helpers/assets";

describeSuite({
id: "D014136",
title: "XCM - LocationToAccountApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
it({
id: "T01",
title: "Should succeed calling LocationToAccountApi::convertLocation",
test: async function () {
const convertLocation = await context
.polkadotJs()
.call.locationToAccountApi.convertLocation(RELAY_V3_SOURCE_LOCATION);

expect(convertLocation.isOk).to.be.true;
expect(convertLocation.asOk.toHuman()).to.eq("0x506172656E740000000000000000000000000000");
},
});
},
});

0 comments on commit b8eb6c4

Please sign in to comment.