From b80db21988c32b48990f316422ef4e565fa18f63 Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Tue, 5 Jul 2022 12:24:54 +0200 Subject: [PATCH] Adding integration tests (#1426) * adding parachains integration tests * final integration-tests * Update parachains/integration-tests/statemine/xcm/2_ump.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemine/xcm/1_dmp.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemine/xcm/4_hrmp.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemint/xcm/1_dmp.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemint/xcm/2_ump.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemint/xcm/4_hrmp.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml Co-authored-by: Chevdor * Update parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml Co-authored-by: Chevdor * clean up & trailling spaces * leftovers Co-authored-by: Chevdor --- .gitignore | 1 + .../integration-tests/statemine/config.toml | 49 +++ .../statemine/xcm/0_init.yml | 144 +++++++ .../integration-tests/statemine/xcm/1_dmp.yml | 254 +++++++++++ .../integration-tests/statemine/xcm/2_ump.yml | 196 +++++++++ .../statemine/xcm/3_hrmp-open-channels.yml | 402 ++++++++++++++++++ .../statemine/xcm/4_hrmp.yml | 353 +++++++++++++++ .../integration-tests/statemint/config.toml | 49 +++ .../statemint/xcm/0_init.yml | 144 +++++++ .../integration-tests/statemint/xcm/1_dmp.yml | 254 +++++++++++ .../integration-tests/statemint/xcm/2_ump.yml | 197 +++++++++ .../statemint/xcm/3_hrmp-open-channels.yml | 400 +++++++++++++++++ .../statemint/xcm/4_hrmp.yml | 352 +++++++++++++++ 13 files changed, 2795 insertions(+) create mode 100644 parachains/integration-tests/statemine/config.toml create mode 100644 parachains/integration-tests/statemine/xcm/0_init.yml create mode 100644 parachains/integration-tests/statemine/xcm/1_dmp.yml create mode 100644 parachains/integration-tests/statemine/xcm/2_ump.yml create mode 100644 parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml create mode 100644 parachains/integration-tests/statemine/xcm/4_hrmp.yml create mode 100644 parachains/integration-tests/statemint/config.toml create mode 100644 parachains/integration-tests/statemint/xcm/0_init.yml create mode 100644 parachains/integration-tests/statemint/xcm/1_dmp.yml create mode 100644 parachains/integration-tests/statemint/xcm/2_ump.yml create mode 100644 parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml create mode 100644 parachains/integration-tests/statemint/xcm/4_hrmp.yml diff --git a/.gitignore b/.gitignore index 9b34b3bb43..24eaf98681 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ polkadot_argument_parsing **/chains/ *.iml .env +bin diff --git a/parachains/integration-tests/statemine/config.toml b/parachains/integration-tests/statemine/config.toml new file mode 100644 index 0000000000..510f3cd3b0 --- /dev/null +++ b/parachains/integration-tests/statemine/config.toml @@ -0,0 +1,49 @@ +[relaychain] +default_command = "./bin/polkadot" +default_args = [ "-lparachain=debug" ] +chain = "kusama-local" + + [[relaychain.nodes]] + name = "alice" + ws_port = 9900 + validator = true + + [[relaychain.nodes]] + name = "bob" + validator = true + + [[relaychain.nodes]] + name = "charlie" + validator = true + + [[relaychain.nodes]] + name = "dave" + validator = true + +[[parachains]] +id = 1000 +chain = "statemine-local" +cumulus_based = true + + [[parachains.collators]] + name = "collator1" + ws_port = 9910 + command = "./bin/polkadot-parachain" + + [[parachains.collators]] + name = "collator2" + command = "./bin/polkadot-parachain" + +[[parachains]] +id = 2000 +chain = "penpal-kusama-2000" +cumulus_based = true + + [[parachains.collators]] + name = "collator3" + ws_port = 9920 + command = "./bin/polkadot-parachain" + + [[parachains.collators]] + name = "collator4" + command = "./bin/polkadot-parachain" diff --git a/parachains/integration-tests/statemine/xcm/0_init.yml b/parachains/integration-tests/statemine/xcm/0_init.yml new file mode 100644 index 0000000000..6f0db4cd61 --- /dev/null +++ b/parachains/integration-tests/statemine/xcm/0_init.yml @@ -0,0 +1,144 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + xcm_verison: &xcm_version '2' + require_weight_at_most: &weight_at_most 1000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + penpal_parachain: + signer: &pp_signer //Alice + decodedCalls: + ap_force_xcm_version: + chain: *assets_parachain + pallet: polkadotXcm + call: forceXcmVersion + args: [ + { # location + parents: 1, + interior: Here + }, + *xcm_version # xcmVersion + ] + +tests: + - name: Initialize Chains + its: + - name: XCM supported versions between chains + actions: + - extrinsics: # Relay Chain sets supported version for Assset Parachain + - chain: *relay_chain + sudo: true + signer: *rc_signer + pallet: xcmPallet + call: forceXcmVersion + args: [ + { # location + parents: 0, + interior: { + X1: { + Parachain: *ap_id + } + } + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attributes: + type: Result + value: Ok + - name: xcmPallet.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Relay Chain sets supported version for Penpal Parachain + - chain: *relay_chain + sudo: true + signer: *rc_signer + pallet: xcmPallet + call: forceXcmVersion + args: [ + { # location + parents: 0, + interior: { + X1: { + Parachain: *pp_id + } + } + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attributes: + type: Result + value: Ok + - name: xcmPallet.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Assset Parachain sets supported version for Relay Chain through it + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $ap_force_xcm_version + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: polkadotXcm.SupportedVersionChanged + chain: *assets_parachain + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Penpal Parachain sets supported version for Relay Chain + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: forceXcmVersion + args: [ + { # location + parents: 1, + interior: Here + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version diff --git a/parachains/integration-tests/statemine/xcm/1_dmp.yml b/parachains/integration-tests/statemine/xcm/1_dmp.yml new file mode 100644 index 0000000000..b5040c740c --- /dev/null +++ b/parachains/integration-tests/statemine/xcm/1_dmp.yml @@ -0,0 +1,254 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + variables: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v1: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} + amount: &amount 1000000000000 + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + require_weight_at_most: &rc_weight_at_most 1000000000 + assets_parachain_account: + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 1 + asset_min_balance: &asset_ed 1000 + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + +tests: + - name: DMP + its: [] + describes: + - name: xcmPallet.limitedTeleportAssets + before: &before_get_balances + - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver + actions: + - queries: + balance_rc_sender_before: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_before: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + its: + - name: Should teleport native assets from the Relay Chain to the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedTeleportAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + - queries: + balance_rc_sender_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_rc_sender_before, + after: $balance_rc_sender_after, + }, + amount: *amount + } + ] + + - name: Should increase the balance of the receiver + actions: + - asserts: + balanceIncreased: + args: [ + { + balances: { + before: $balance_ap_receiver_before, + after: $balance_ap_receiver_after, + } + } + ] + + - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) + its: + - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *rc_weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: xcmPallet.send | Native - Transact(assets.forceCreate) + its: + - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Native, + requireWeightAtMost: *rc_weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: system.ExtrinsicFailed + attribute: + type: SpRuntimeDispatchError + value: BadOrigin + + - name: xcmPallet.limitedReserveTransferAssets + before: *before_get_balances + its: + - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedReserveTransferAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 750,645,000 + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isIncomplete: true + value: ['1,000,000,000' , UntrustedReserveLocation] + - queries: + balance_rc_sender_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_rc_sender_before, + after: $balance_rc_sender_after, + }, + amount: *amount + } + ] + + - name: Should keep the balance of the receiver + actions: + - asserts: + equal: + args: + [ + $balance_ap_receiver_before, + $balance_ap_receiver_after + ] diff --git a/parachains/integration-tests/statemine/xcm/2_ump.yml b/parachains/integration-tests/statemine/xcm/2_ump.yml new file mode 100644 index 0000000000..6c8a816d16 --- /dev/null +++ b/parachains/integration-tests/statemine/xcm/2_ump.yml @@ -0,0 +1,196 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + variables: + common: + amount: &amount 1000000000000 + require_weight_at_most: &weight_at_most 1000000000 + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice + relay_chain_beneficiary: &rc_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *rc_acc }}}}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + decodedCalls: + system_remark: + chain: *relay_chain + pallet: system + call: remark + args: [ 0x0011 ] + +tests: + - name: UMP + describes: + - name: polkadotXcm.limitedTeleportAssets + before: + - name: DEPENDANCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedTeleportAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + + - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver + actions: + - queries: + balance_ap_sender_before: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + balance_rc_receiver_before: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + its: + - name: Should teleport native assets back from Assets Parachain to the Relay Chain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedTeleportAssets + args: [ + *rc_dest, # destination + *rc_benf, # beneficiary + { v1: [ *ap_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: ump.ExecutedUpward + chain: *relay_chain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 297,578,000 + - queries: + balance_ap_sender_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + balance_rc_receiver_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_ap_sender_before, + after: $balance_ap_sender_after, + }, + amount: *amount + } + ] + + - name: Should increase the balance of the receiver + actions: + - asserts: + balanceIncreased: + args: [ + { + balances: { + before: $balance_rc_receiver_before, + after: $balance_rc_receiver_after, + } + } + ] + + - name: polkadotXcm.send | Native - Transact(system.remark) + its: + - name: Assets Parachain SHOULD NOT be able to dipatch 'send' call + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $system_remark + } + } + ] + } + ] + events: + - name: system.ExtrinsicFailed + attribute: + type: SpRuntimeDispatchError + value: BadOrigin + + - name: polkadotXcm.limitedReserveTransferAssets + its: + - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *rc_dest, # destination + *rc_benf, # beneficiary + { v1: [ *ap_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attribute: + type: XcmV2TraitsOutcome + isError: true + value: Barrier diff --git a/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml new file mode 100644 index 0000000000..0745c30742 --- /dev/null +++ b/parachains/integration-tests/statemine/xcm/3_hrmp-open-channels.yml @@ -0,0 +1,402 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 2000000000000 + require_weight_at_most: &weight_at_most 1000000000 + hrmp_channels: + proposed_max_capacity: &max_capacity 8 + proposed_max_message_size: &max_message_size 8192 + channel: &channel { + maxCapacity: 8, + maxTotalSize: 8192, + maxMessageSize: 8192, + msgCount: 0, + totalSize: 0, + mqcHead: null, + senderDeposit: 0, + recipientDeposit: 0 + } + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah + relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + penpal_parachain: + sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ + signer: &pp_signer //Alice + decodedCalls: + init_open_channel_with_ap: + chain: *relay_chain + pallet: hrmp + call: hrmpInitOpenChannel + args: [ + *ap_id, # recipient + *max_capacity, # proposedMaxCapacity + *max_message_size # proposedMaxMessageSize + ] + init_open_channel_with_cp: + chain: *relay_chain + pallet: hrmp + call: hrmpInitOpenChannel + args: [ + *pp_id, # recipient + *max_capacity, # proposedMaxCapacity + *max_message_size # proposedMaxMessageSize + ] + accept_open_channel_with_ap: + chain: *relay_chain + pallet: hrmp + call: hrmpAcceptOpenChannel + args: [ + *ap_id, # recipient + ] + accept_init_open_request_from_cp: + chain: *relay_chain + pallet: hrmp + call: hrmpAcceptOpenChannel + args: [ + *pp_id, # sender + ] + xcm_accept_init_open_request_from_cp: + chain: *assets_parachain + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $accept_init_open_request_from_cp + } + } + ] + } + ] + xcm_init_open_channel_with_cp: + chain: *assets_parachain + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $init_open_channel_with_cp + } + } + ] + } + ] + +tests: + - name: HRMP + beforeEach: + - name: DEPENDANCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *pp_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + + - name: DEPENDANCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *ap_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + describes: + - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Penpal Parachain sends a request to the Relay Chain to open a channel with the Assets Parchain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $init_open_channel_with_ap + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: ump.ExecutedUpward + chain: *relay_chain + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000 + - name: hrmp.OpenChannelRequested + chain: *relay_chain + - queries: + requested_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpOpenChannelRequestsList + args: [] + - asserts: + equal: + args: [ + $requested_channels, + [ + { + sender: *pp_id, + recipient: *ap_id + } + ] + ] + + - name: hrmp.hrmpAcceptOpenChannel (Assets Parachain → Penpal Parachain) + its: + - name: Assets Parachain sends a response to the Relay Chain accepting the Penpal Parachain's request for openning a HRMP channel + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $xcm_accept_init_open_request_from_cp + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: polkadotXcm.Sent + chain: *assets_parachain + - name: ump.ExecutedUpward + timeout: 40000 + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,160,892,000 + - name: hrmp.OpenChannelAccepted + timeout: 40000 + - queries: + open_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpChannels + delay: 80000 + args: [ + { + sender: *pp_id, + recipient: *ap_id + } + ] + - asserts: + equal: + args: [ + $open_channels, + *channel + ] + + - name: hrmp.hrmpInitOpenChannel (Assets Parachain → Penpal Parachain) + its: + - name: Assets Parchain sends a request to the Relay Chain to open a channel with a Penpal Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $xcm_init_open_channel_with_cp + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: polkadotXcm.Sent + chain: *assets_parachain + - name: ump.ExecutedUpward + timeout: 40000 + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,160,892,000 + - name: hrmp.OpenChannelRequested + timeout: 40000 + - queries: + requested_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpOpenChannelRequestsList + args: [] + - asserts: + equal: + args: [ + $requested_channels, + [ + { + sender: *ap_id, + recipient: *pp_id + } + ] + ] + + - name: hrmp.hrmpAcceptOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Penpal Parachain sends a response to the Relay Chain accepting the Assets Parachain's request for openning a HRMP channel + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $accept_open_channel_with_ap + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: ump.ExecutedUpward + chain: *relay_chain + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000 + - name: hrmp.OpenChannelAccepted + chain: *relay_chain diff --git a/parachains/integration-tests/statemine/xcm/4_hrmp.yml b/parachains/integration-tests/statemine/xcm/4_hrmp.yml new file mode 100644 index 0000000000..a8b79ed3b9 --- /dev/null +++ b/parachains/integration-tests/statemine/xcm/4_hrmp.yml @@ -0,0 +1,353 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 1000000000000 + require_weight_at_most: &weight_at_most 1000000000 + amount_to_send: &amount_to_send 500000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_dest_routed: &ap_dest_routed { v1: { parents: 1, interior: { x1: { parachain: *ap_id } }}} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 2 + assets_pallet_id: &assets_pallet_id 50 + asset_min_balance: &asset_ed 1000 + penpal_parachain_destination: &pp_dest { v1: { parents: 1, interior: { x1: { parachain: *pp_id } }}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} + suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} + suff_asset_fungible: &ap_suff_asset_fungible { id: *suff_asset, fun: { fungible: *weight_at_most }} + suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: *weight_at_most }} + penpal_parachain: + sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS + signer: &pp_signer //Alice + penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + system_remark_with_event: + chain: *assets_parachain + pallet: system + call: remarkWithEvent + args: [ 0x0011 ] + +tests: + - name: HRMP + describes: + - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain + before: + - name: DEPENDANCY | A sufficient Asset should exist in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: DEPENDANCY | Some Assets should be minted for the sender + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: assets + call: mint + args: [ + *asset_id, + *ap_wallet, + *amount + ] + events: + - name: assets.Issued + + its: + - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V1: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: Any, + id: *pp_acc + } + } + } + } + }, + { # assets + V1: [ + { + id: { + Concrete: { + parents: 0, + interior: { + X2: [ + { + PalletInstance: 50 + }, + { + GeneralIndex: *asset_id + } + ] + } + } + }, + fun: { + Fungible: *amount_to_send + } + } + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,000,000,000 + - name: assets.Transferred + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Transferred + attributes: + type: u128 + value: *amount_to_send + + - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain + its: + - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V1: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: Any, + id: *pp_acc + } + } + } + } + }, + { # assets + V1: [ + *ap_ksm_fungible + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,000,000,000 + - name: balances.Endowed + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: balances.Endowed + attributes: + type: u128 + value: *amount + + - name: polkadotXcm.send( system.remarkWithEvent() ) | Penpal Parachain -> Assets Parachain + before: + - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain + actions: + - queries: + assets_balance_pp_sovereign_before: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + its: + - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v2: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $system_remark_with_event + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: assets.Burned + chain: *assets_parachain + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Issued + chain: *assets_parachain + attributes: + type: u32 + value: *asset_id + - name: system.Remarked + chain: *assets_parachain + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - queries: + assets_balance_pp_sovereign_after: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + + - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain + actions: + - asserts: + assetsDecreased: + args: [ + { + balances: { + before: $assets_balance_pp_sovereign_before, + after: $assets_balance_pp_sovereign_after, + }, + } + ] + + - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v2: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible_fail] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible_fail, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $system_remark_with_event + } + } + ] + } + ] + events: + - name: xcmpQueue.Fail + chain: *assets_parachain + attributes: + type: XcmV2TraitsError + value: FailedToTransactAsset diff --git a/parachains/integration-tests/statemint/config.toml b/parachains/integration-tests/statemint/config.toml new file mode 100644 index 0000000000..f989d366ef --- /dev/null +++ b/parachains/integration-tests/statemint/config.toml @@ -0,0 +1,49 @@ +[relaychain] +default_command = "./bin/polkadot" +default_args = [ "-lparachain=debug" ] +chain = "polkadot-local" + + [[relaychain.nodes]] + name = "alice" + ws_port = 9900 + validator = true + + [[relaychain.nodes]] + name = "bob" + validator = true + + [[relaychain.nodes]] + name = "charlie" + validator = true + + [[relaychain.nodes]] + name = "dave" + validator = true + +[[parachains]] +id = 1000 +chain = "statemint-local" +cumulus_based = true + + [[parachains.collators]] + name = "collator1" + ws_port = 9910 + command = "./bin/polkadot-parachain" + + [[parachains.collators]] + name = "collator2" + command = "./bin/polkadot-parachain" + +[[parachains]] +id = 2000 +chain = "penpal-polkadot-2000" +cumulus_based = true + + [[parachains.collators]] + name = "collator3" + ws_port = 9920 + command = "./bin/polkadot-parachain" + + [[parachains.collators]] + name = "collator4" + command = "./bin/polkadot-parachain" diff --git a/parachains/integration-tests/statemint/xcm/0_init.yml b/parachains/integration-tests/statemint/xcm/0_init.yml new file mode 100644 index 0000000000..6f0db4cd61 --- /dev/null +++ b/parachains/integration-tests/statemint/xcm/0_init.yml @@ -0,0 +1,144 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + xcm_verison: &xcm_version '2' + require_weight_at_most: &weight_at_most 1000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + penpal_parachain: + signer: &pp_signer //Alice + decodedCalls: + ap_force_xcm_version: + chain: *assets_parachain + pallet: polkadotXcm + call: forceXcmVersion + args: [ + { # location + parents: 1, + interior: Here + }, + *xcm_version # xcmVersion + ] + +tests: + - name: Initialize Chains + its: + - name: XCM supported versions between chains + actions: + - extrinsics: # Relay Chain sets supported version for Assset Parachain + - chain: *relay_chain + sudo: true + signer: *rc_signer + pallet: xcmPallet + call: forceXcmVersion + args: [ + { # location + parents: 0, + interior: { + X1: { + Parachain: *ap_id + } + } + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attributes: + type: Result + value: Ok + - name: xcmPallet.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Relay Chain sets supported version for Penpal Parachain + - chain: *relay_chain + sudo: true + signer: *rc_signer + pallet: xcmPallet + call: forceXcmVersion + args: [ + { # location + parents: 0, + interior: { + X1: { + Parachain: *pp_id + } + } + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attributes: + type: Result + value: Ok + - name: xcmPallet.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Assset Parachain sets supported version for Relay Chain through it + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $ap_force_xcm_version + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: polkadotXcm.SupportedVersionChanged + chain: *assets_parachain + attribute: + type: u32 + value: *xcm_version + - extrinsics: # Penpal Parachain sets supported version for Relay Chain + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: forceXcmVersion + args: [ + { # location + parents: 1, + interior: Here + }, + *xcm_version # xcmVersion + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.SupportedVersionChanged + attribute: + type: u32 + value: *xcm_version diff --git a/parachains/integration-tests/statemint/xcm/1_dmp.yml b/parachains/integration-tests/statemint/xcm/1_dmp.yml new file mode 100644 index 0000000000..02e5b864bf --- /dev/null +++ b/parachains/integration-tests/statemint/xcm/1_dmp.yml @@ -0,0 +1,254 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + variables: + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v1: { parents: 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} + amount: &amount 1000000000000 + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + require_weight_at_most: &rc_weight_at_most 1000000000 + assets_parachain_account: + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 1 + asset_min_balance: &asset_ed 1000 + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + +tests: + - name: DMP + its: [] + describes: + - name: xcmPallet.limitedTeleportAssets + before: &before_get_balances + - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver + actions: + - queries: + balance_rc_sender_before: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_before: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + its: + - name: Should teleport native assets from the Relay Chain to the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedTeleportAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + - queries: + balance_rc_sender_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_rc_sender_before, + after: $balance_rc_sender_after, + }, + amount: *amount + } + ] + + - name: Should increase the balance of the receiver + actions: + - asserts: + balanceIncreased: + args: [ + { + balances: { + before: $balance_ap_receiver_before, + after: $balance_ap_receiver_after, + } + } + ] + + - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) + its: + - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *rc_weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: xcmPallet.send | Native - Transact(assets.forceCreate) + its: + - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Native, + requireWeightAtMost: *rc_weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: system.ExtrinsicFailed + attribute: + type: SpRuntimeDispatchError + value: BadOrigin + + - name: xcmPallet.limitedReserveTransferAssets + before: *before_get_balances + its: + - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedReserveTransferAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,000,000,000 + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isIncomplete: true + value: ['1,000,000,000' , UntrustedReserveLocation] + - queries: + balance_rc_sender_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + balance_ap_receiver_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_rc_sender_before, + after: $balance_rc_sender_after, + }, + amount: *amount + } + ] + + - name: Should keep the balance of the receiver + actions: + - asserts: + equal: + args: + [ + $balance_ap_receiver_before, + $balance_ap_receiver_after + ] diff --git a/parachains/integration-tests/statemint/xcm/2_ump.yml b/parachains/integration-tests/statemint/xcm/2_ump.yml new file mode 100644 index 0000000000..c20872ca68 --- /dev/null +++ b/parachains/integration-tests/statemint/xcm/2_ump.yml @@ -0,0 +1,197 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + variables: + common: + amount: &amount 1000000000000 + require_weight_at_most: &weight_at_most 1000000000 + relay_chain: + signer: &rc_signer //Alice + wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + assets_parachain_beneficiary: &ap_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *ap_acc }}}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + relay_chain_beneficiary: &rc_benf {v1: { parents: 0, interior: { x1: { accountId32: { network: { any: true }, id: *rc_acc }}}}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + decodedCalls: + system_remark: + chain: *relay_chain + pallet: system + call: remark + args: [ 0x0011 ] + +tests: + - name: UMP + describes: + - name: polkadotXcm.limitedTeleportAssets + before: + - name: DEPENDANCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: xcmPallet + call: limitedTeleportAssets + args: [ + *ap_dest, # destination + *ap_benf, # beneficiary + { v1: [ *rc_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: xcmPallet.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + + - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver + actions: + - queries: + balance_ap_sender_before: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + balance_rc_receiver_before: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + + its: + - name: Should be able to teleport native assets back from Assets Parachain to the Relay Chain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedTeleportAssets + args: [ + *rc_dest, # destination + *rc_benf, # beneficiary + { v1: [ *ap_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: ump.ExecutedUpward + chain: *relay_chain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + - queries: + balance_ap_sender_after: + chain: *assets_parachain + pallet: system + call: account + args: [ *ap_wallet ] + balance_rc_receiver_after: + chain: *relay_chain + pallet: system + call: account + args: [ *rc_wallet ] + + - name: Should reduce the balance of the sender + actions: + - asserts: + balanceDecreased: + args: [ + { + balances: { + before: $balance_ap_sender_before, + after: $balance_ap_sender_after, + }, + amount: *amount + } + ] + + - name: Should increase the balance of the receiver + actions: + - asserts: + balanceIncreased: + args: [ + { + balances: { + before: $balance_rc_receiver_before, + after: $balance_rc_receiver_after, + } + } + ] + + - name: polkadotXcm.send | Native - Transact(system.remark) + its: + - name: Assets Parachain SHOULD NOT be able to dipatch 'send' call + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $system_remark + } + } + ] + } + ] + events: + - name: system.ExtrinsicFailed + attribute: + type: SpRuntimeDispatchError + value: BadOrigin + + - name: polkadotXcm.limitedReserveTransferAssets + its: + - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *rc_dest, # destination + *rc_benf, # beneficiary + { v1: [ *ap_ksm_fungible ] }, # assets + 0, # feeAssetItem + { unlimited: true } # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attribute: + type: XcmV2TraitsOutcome + isError: true + value: Barrier diff --git a/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml b/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml new file mode 100644 index 0000000000..c8d1d85290 --- /dev/null +++ b/parachains/integration-tests/statemint/xcm/3_hrmp-open-channels.yml @@ -0,0 +1,400 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 2000000000000 + require_weight_at_most: &weight_at_most 1000000000 + hrmp_channels: + proposed_max_capacity: &max_capacity 8 + proposed_max_message_size: &max_message_size 8192 + channel: &channel { + maxCapacity: 8, + maxTotalSize: 8192, + maxMessageSize: 8192, + msgCount: 0, + totalSize: 0, + mqcHead: null, + senderDeposit: 0, + recipientDeposit: 0 + } + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} + ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} + assets_parachain_account: + sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah + relay_chain_destination: &rc_dest { v1: { parents: 1, interior: { here: true }}} + penpal_parachain: + sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ + signer: &pp_signer //Alice + decodedCalls: + init_open_channel_with_ap: + chain: *relay_chain + pallet: hrmp + call: hrmpInitOpenChannel + args: [ + *ap_id, # recipient + *max_capacity, # proposedMaxCapacity + *max_message_size # proposedMaxMessageSize + ] + init_open_channel_with_cp: + chain: *relay_chain + pallet: hrmp + call: hrmpInitOpenChannel + args: [ + *pp_id, # recipient + *max_capacity, # proposedMaxCapacity + *max_message_size # proposedMaxMessageSize + ] + accept_open_channel_with_ap: + chain: *relay_chain + pallet: hrmp + call: hrmpAcceptOpenChannel + args: [ + *ap_id, # recipient + ] + accept_init_open_request_from_cp: + chain: *relay_chain + pallet: hrmp + call: hrmpAcceptOpenChannel + args: [ + *pp_id, # sender + ] + xcm_accept_init_open_request_from_cp: + chain: *assets_parachain + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $accept_init_open_request_from_cp + } + } + ] + } + ] + xcm_init_open_channel_with_cp: + chain: *assets_parachain + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $init_open_channel_with_cp + } + } + ] + } + ] + +tests: + - name: HRMP + beforeEach: + - name: DEPENDANCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *pp_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + + - name: DEPENDANCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + pallet: balances + call: transfer + args: [ + *ap_sovereign, # destination + *amount, # value + ] + events: + - name: balances.Transfer + describes: + - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Penpal Parachain sends a request to the Relay Chain to open a channel with the Assets Parchain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $init_open_channel_with_ap + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: ump.ExecutedUpward + chain: *relay_chain + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000 + - name: hrmp.OpenChannelRequested + chain: *relay_chain + - queries: + requested_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpOpenChannelRequestsList + args: [] + - asserts: + equal: + args: [ + $requested_channels, + [ + { + sender: *pp_id, + recipient: *ap_id + } + ] + ] + + - name: hrmp.hrmpAcceptOpenChannel (Assets Parachain → Penpal Parachain) + its: + - name: Assets Parachain sends a response to the Relay Chain accepting the Penpal Parachain's request for openning a HRMP channel + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $xcm_accept_init_open_request_from_cp + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: polkadotXcm.Sent + chain: *assets_parachain + - name: ump.ExecutedUpward + timeout: 40000 + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + - name: hrmp.OpenChannelAccepted + timeout: 40000 + - queries: + open_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpChannels + delay: 80000 + args: [ + { + sender: *pp_id, + recipient: *ap_id + } + ] + - asserts: + equal: + args: [ + $open_channels, + *channel + ] + + - name: hrmp.hrmpInitOpenChannel (Assets Parachain → Penpal Parachain) + its: + - name: Assets Parchain sends a request to the Relay Chain to open a channel with a Penpal Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $xcm_init_open_channel_with_cp + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - name: polkadotXcm.Sent + chain: *assets_parachain + - name: ump.ExecutedUpward + timeout: 40000 + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000,000 + - name: hrmp.OpenChannelRequested + timeout: 40000 + - queries: + requested_channels: + chain: *relay_chain + pallet: hrmp + call: hrmpOpenChannelRequestsList + args: [] + - asserts: + equal: + args: [ + $requested_channels, + [ + { + sender: *ap_id, + recipient: *pp_id + } + ] + ] + + - name: hrmp.hrmpAcceptOpenChannel (Penpal Parachain → Assets Parachain) + its: + - name: Penpal Parachain sends a response to the Relay Chain accepting the Assets Parachain's request for openning a HRMP channel + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *rc_dest, # destination + { + v2: [ #message + { + WithdrawAsset: [*rc_ksm_fungible] + }, + { + BuyExecution: { + fees: *rc_ksm_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: Native, + requireWeightAtMost: *weight_at_most, + call: $accept_open_channel_with_ap + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: ump.ExecutedUpward + chain: *relay_chain + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 4,000,000 + - name: hrmp.OpenChannelAccepted + chain: *relay_chain diff --git a/parachains/integration-tests/statemint/xcm/4_hrmp.yml b/parachains/integration-tests/statemint/xcm/4_hrmp.yml new file mode 100644 index 0000000000..94783d5ed7 --- /dev/null +++ b/parachains/integration-tests/statemint/xcm/4_hrmp.yml @@ -0,0 +1,352 @@ +--- +settings: + chains: + relay_chain: &relay_chain + wsPort: 9900 + assets_parachain: &assets_parachain + wsPort: 9910 + paraId: &ap_id 1000 + penpal_parachain: &penpal_parachain + wsPort: 9920 + paraId: &pp_id 2000 + variables: + common: + amount: &amount 1000000000000 + require_weight_at_most: &weight_at_most 1000000000 + amount_to_send: &amount_to_send 500000000000 + chains: + relay_chain: + signer: &rc_signer //Alice + assets_parachain_destination: &ap_dest { v1: { 0, interior: { x1: { parachain: *ap_id }}}} + assets_parachain_dest_routed: &ap_dest_routed { v1: { parents: 1, interior: { x1: { parachain: *ap_id } }}} + assets_parachain_account: + signer: &ap_signer //Alice + wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F + asset_id: &asset_id 2 + assets_pallet_id: &assets_pallet_id 50 + asset_min_balance: &asset_ed 1000 + penpal_parachain_destination: &pp_dest { v1: { parents: 1, interior: { x1: { parachain: *pp_id } }}} + ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} + ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} + suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} + suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} + suff_asset_fungible: &ap_suff_asset_fungible { id: *suff_asset, fun: { fungible: *weight_at_most }} + suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: *weight_at_most }} + penpal_parachain: + sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS + signer: &pp_signer //Alice + penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' + decodedCalls: + force_create_asset: + chain: *assets_parachain + pallet: assets + call: forceCreate + args: [ + *asset_id, + { Id: *ap_wallet }, # owner + true, # isSufficient + *asset_ed # minBalance + ] + system_remark_with_event: + chain: *assets_parachain + pallet: system + call: remarkWithEvent + args: [ 0x0011 ] + +tests: + - name: HRMP + describes: + - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain + before: + - name: DEPENDANCY | A sufficient Asset should exist in the Assets Parachain + actions: + - extrinsics: + - chain: *relay_chain + signer: *rc_signer + sudo: true + pallet: xcmPallet + call: send + args: [ + *ap_dest, # destination + { + v2: [ #message + { + Transact: { + originType: Superuser, + requireWeightAtMost: *weight_at_most, + call: $force_create_asset + } + } + ] + } + ] + events: + - name: xcmPallet.Sent + - name: dmpQueue.ExecutedDownward + chain: *assets_parachain + attribute: + type: XcmV2TraitsOutcome + isComplete: true + value: 2,000,000,000 + - queries: + forced_created_asset: + chain: *assets_parachain + pallet: assets + call: asset + args: [ *asset_id ] + - asserts: + isSome: + args: [ $forced_created_asset ] + + - name: DEPENDANCY | Some Assets should be minted for the sender + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: assets + call: mint + args: [ + *asset_id, + *ap_wallet, + *amount + ] + events: + - name: assets.Issued + its: + - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V1: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: Any, + id: *pp_acc + } + } + } + } + }, + { # assets + V1: [ + { + id: { + Concrete: { + parents: 0, + interior: { + X2: [ + { + PalletInstance: 50 + }, + { + GeneralIndex: *asset_id + } + ] + } + } + }, + fun: { + Fungible: *amount_to_send + } + } + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,000,000,000 + - name: assets.Transferred + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Transferred + attributes: + type: u128 + value: *amount_to_send + + - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain + its: + - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain + actions: + - extrinsics: + - chain: *assets_parachain + signer: *ap_signer + pallet: polkadotXcm + call: limitedReserveTransferAssets + args: [ + *pp_dest, # destination + { # beneficiary + V1: { + parents: 0, + interior: { + X1: { + AccountId32: { + network: Any, + id: *pp_acc + } + } + } + } + }, + { # assets + V1: [ + *ap_ksm_fungible + ] + }, + 0, # feeAssetItem + Unlimited # weightLimit + ] + events: + - name: polkadotXcm.Attempted + attributes: + type: XcmV2TraitsOutcome + isComplete: true + value: 1,000,000,000 + - name: balances.Endowed + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: balances.Endowed + attributes: + type: u128 + value: *amount + + - name: polkadotXcm.send( system.remarkWithEvent() ) | Penpal Parachain -> Assets Parachain + before: + - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain + actions: + - queries: + assets_balance_pp_sovereign_before: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + its: + - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset[2] in Assets Parachain + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v2: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $system_remark_with_event + } + } + ] + } + ] + events: + - name: sudo.Sudid + attribute: + type: Result + value: Ok + - name: polkadotXcm.Sent + - name: assets.Burned + chain: *assets_parachain + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - name: assets.Issued + chain: *assets_parachain + attributes: + type: u32 + value: *asset_id + - name: system.Remarked + chain: *assets_parachain + attributes: + type: AccountId32 + value: *pp_sovereign_sibl + - queries: + assets_balance_pp_sovereign_after: + chain: *assets_parachain + pallet: assets + call: account + args: [ + *asset_id, + *pp_sovereign_sibl + ] + + - name: Should reduce the asset[2] balance of the Penpal Parachain's SovereignAccount in the Assets Parachain + actions: + - asserts: + assetsDecreased: + args: [ + { + balances: { + before: $assets_balance_pp_sovereign_before, + after: $assets_balance_pp_sovereign_after, + }, + } + ] + + - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient asset[3] if not balance + actions: + - extrinsics: + - chain: *penpal_parachain + signer: *pp_signer + sudo: true + pallet: polkadotXcm + call: send + args: [ + *ap_dest_routed, # destination + { + v2: [ #message + { + WithdrawAsset: [*ap_suff_asset_fungible_fail] + }, + { + BuyExecution: { + fees: *ap_suff_asset_fungible_fail, + weightLimit: Unlimited + } + }, + { + Transact: { + originType: SovereignAccount, + requireWeightAtMost: *weight_at_most, + call: $system_remark_with_event + } + } + ] + } + ] + events: + - name: xcmpQueue.Fail + chain: *assets_parachain + attributes: + type: XcmV2TraitsError + value: FailedToTransactAsset