[Feature] XCM-Emulator (#2447)

* [Feature] XCM-Emulator

* ".git/.scripts/commands/fmt/fmt.sh"

* rename

* readme

* more rename

* rename directory

* implement AssetTransactor

* Update xcm/xcm-emulator/README.md

Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com>

* address review comments (#2502)

* Update xcm/xcm-emulator/example/src/lib.rs

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* Update xcm/xcm-emulator/README.md

* Use 2d weights.

* Point out nearer the failure why it should fail

* Move test-runtime to under examples

* Walk through how to use it

* proof needs to be non-zero

* Apply suggestions from code review

* Update xcm/xcm-emulator/README.md

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* Improve xcm emulator (#2593)

* folder restructutre

* common created

* make macros repetitions

* messenger traits for relay and para

* default Messenger impls

* messenger traits refactor

* declared two networks

* init network approach works

* queues use HashMap but relay block number

* init and reset refactor

* messengers trait name changed

* relay block number suboptimal

* fix reset hashmap keys

* genesis added

* test ext added for parachains

* genesis added relay chains

* genesis to storage

* new_ext replaced by on_init

* new relay block number approach

* ext_wrapper added

* added types to Parachain trait

* relay chain with types

* restructure

* para_ids working

* replace para_id getter

* replace para_id getter 2

* tests restructure + common variables

* added sovereign and balances helpers

* more helpers + tess pass

* expected events macro added

* added events trait method

* expect_events macro improve

* expect_events macro done

* network traits added

* reserve_transfer test added

* para & relay macro inputs redefined

* added collectives & BH paras

* test restructure

* statemine removed

* nitpick

* rename test folder + events logs

* clean

* weight threshold helper

* update readme

* remove cumulus-test-service dependancy

* fmt

* comment docs

* update e2e tests to xcm v3

* clippy + runtime-benchmark + clean docs

---------

Co-authored-by: command-bot <>
Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com>
Co-authored-by: Squirrel <gilescope@gmail.com>
Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
Co-authored-by: Ignacio Palacios <ignacio.palacios.santos@gmail.com>
This commit is contained in:
Roman Useinov
2023-05-19 19:53:41 +02:00
committed by GitHub
parent 8425e2a5c0
commit 944ab483d5
40 changed files with 3848 additions and 1859 deletions
@@ -0,0 +1,154 @@
---
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_version: &xcm_version '3'
require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000}
chains:
relay_chain:
signer: &rc_signer //Alice
assets_parachain_destination: &ap_dest { v3: { 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 Asset 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<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.SupportedVersionChanged
attributes:
- 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<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.SupportedVersionChanged
attributes:
- type: u32
value: *xcm_version
- extrinsics: # Asset 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 2200000000,
proofSize: 200000
}
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: *weight_at_most,
call: $ap_force_xcm_version
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: polkadotXcm.SupportedVersionChanged
chain: *assets_parachain
attributes:
- 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
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: polkadotXcm.SupportedVersionChanged
attributes:
- type: u32
value: *xcm_version
@@ -0,0 +1,267 @@
---
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 { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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 {refTime: 1000000000, proofSize: 200000}
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
{ v3: [ *rc_ksm_fungible ] },
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"162,379,000","proofSize":"0"}
- 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: *rc_weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: xcmPallet.Sent
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"1,014,103,000","proofSize":"200,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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originKind: Native,
requireWeightAtMost: *rc_weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: system.ExtrinsicFailed
attributes:
- 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
{ v3: [ *rc_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"750,645,000","proofSize":"0"}
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Incomplete
value: [{"refTime":"1,000,000,000","proofSize":"0"},"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
]
@@ -0,0 +1,206 @@
---
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 {refTime: 1000000000, proofSize: 0}
relay_chain:
signer: &rc_signer //Alice
wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice
assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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 { v3: { parents: 1, interior: { here: true }}}
assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice
relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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: DEPENDENCY | 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
{ v3: [ *rc_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"761,173,000","proofSize":"0"}
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"162,379,000","proofSize":"0"}
- 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
{ v3: [ *ap_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"539,494,000","proofSize":"7,133"}
- name: ump.ExecutedUpward
chain: *relay_chain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"298,716,000","proofSize":"0"}
- 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 dispatch 'send' call
actions:
- extrinsics:
- chain: *assets_parachain
signer: *ap_signer
pallet: polkadotXcm
call: send
args: [
*rc_dest, # destination
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originKind: Native,
requireWeightAtMost: *weight_at_most,
call: $system_remark
}
}
]
}
]
events:
- name: system.ExtrinsicFailed
attributes:
- 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
{ v3: [ *ap_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Error
value: Barrier
@@ -0,0 +1,134 @@
---
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 {refTime: 1000000000, proofSize: 20000}
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 { v3: { 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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 { v3: { parents: 1, interior: { here: true }}}
penpal_parachain:
sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ
signer: &pp_signer //Alice
tests:
- name: HRMP
beforeEach:
- name: DEPENDENCY | 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: DEPENDENCY | 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: Open Penpal Parachain to Assets Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceOpenHrmpChannel
args: [
2000,
1000,
8,
8192
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: hrmp.HrmpChannelForceOpened
- name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain)
its:
- name: Open Assets Parachain to PenPal Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceOpenHrmpChannel
args: [
1000,
2000,
8,
8192
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: hrmp.HrmpChannelForceOpened
- name: hrmp.forceProcessHrmpOpen (make sure all the channels are open)
its:
- name: Make sure all the pending channels are open
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceProcessHrmpOpen
args: [ 2 ]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
@@ -0,0 +1,403 @@
---
# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to
# work.
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:
mint_amount: &mint_amount 1000000000000
amount: &amount 100000000000
require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000}
amount_to_send: &amount_to_send 500000000000
chains:
relay_chain:
signer: &rc_signer //Alice
assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_dest_routed: &ap_dest_routed { v3: { 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 { v3: { 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_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }}
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
]
force_create_asset2:
chain: *assets_parachain
pallet: assets
call: forceCreate
args: [
*asset_id,
{ Id: *ap_wallet }, # owner
true, # isSufficient
*asset_ed # minBalance
]
tests:
- name: HRMP
describes:
- name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain
before:
- name: DEPENDENCY | 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912"
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: xcmPallet.Sent
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"1,216,703,000","proofSize":"20,000"}
- queries:
forced_created_asset:
chain: *assets_parachain
pallet: assets
call: asset
args: [ *asset_id ]
- asserts:
isSome:
args: [ $forced_created_asset ]
- name: DEPENDENCY | 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,
*mint_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
V3: {
parents: 0,
interior: {
X1: {
AccountId32: {
id: *pp_acc
}
}
}
}
},
{ # assets
V3: [
{
id: {
Concrete: {
parents: 0,
interior: {
X2: [
{
PalletInstance: *assets_pallet_id
},
{
GeneralIndex: *asset_id
}
]
}
}
},
fun: {
Fungible: *amount_to_send
}
}
]
},
0, # feeAssetItem
Unlimited # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"679,150,000","proofSize":"6,196"}
- 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
V3: {
parents: 0,
interior: {
X1: {
AccountId32: {
id: *pp_acc
}
}
}
}
},
{ # assets
V3: [
*ap_ksm_fungible
]
},
0, # feeAssetItem
Unlimited # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"679,150,000","proofSize":"6,196"}
- name: balances.Endowed
attributes:
- type: AccountId32
value: *pp_sovereign_sibl
- name: balances.Endowed
attributes:
- type: u128
value: *amount
- name: polkadotXcm.send( assets.forceCreateAsset ) | 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
{
v3: [ #message
{
WithdrawAsset: [
{
id: {
concrete: {
parents: 0,
interior: {
X2: [
{ PalletInstance: *assets_pallet_id },
{ GeneralIndex: *asset_id }
]
}
}
},
fun: { fungible: *amount }}
]
},
{
BuyExecution: {
fees: { id: *suff_asset, fun: { fungible: *amount }},
weightLimit: Unlimited
}
},
{
Transact: {
originKind: SovereignAccount,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset2
}
},
{
RefundSurplus
},
{
DepositAsset: {
assets: { Wild: All },
beneficiary: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: , # None
id: *pp_acc
}
}
}}
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
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
- queries:
assets_balance_pp_sovereign_after:
chain: *assets_parachain
pallet: assets
call: account
args: [
*asset_id,
*pp_sovereign_sibl
]
forced_created_asset2:
chain: *assets_parachain
pallet: assets
call: asset
args: [ 3 ]
- asserts:
isSome:
args: [ $forced_created_asset2 ]
- 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
{
v3: [ #message
{
WithdrawAsset: [*ap_suff_asset_fungible_fail]
},
{
BuyExecution: {
fees: *ap_suff_asset_fungible_fail,
weightLimit: Unlimited
}
},
{
Transact: {
originKind: SovereignAccount,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset2
}
}
]
}
]
events:
- name: xcmpQueue.Fail
chain: *assets_parachain
attributes:
- type: XcmV3TraitsError
value: FailedToTransactAsset
@@ -0,0 +1,70 @@
[relaychain]
default_command = "./bin/polkadot"
default_args = [ "-lparachain=debug", "-lxcm=trace" ]
chain = "kusama-local"
[[relaychain.nodes]]
name = "alice"
ws_port = 9900
validator = true
[[relaychain.nodes]]
name = "bob"
ws_port = 9901
validator = true
[[relaychain.nodes]]
name = "charlie"
ws_port = 9902
validator = true
[[relaychain.nodes]]
name = "dave"
ws_port = 9903
validator = true
[[parachains]]
id = 1000
chain = "statemine-local"
cumulus_based = true
[[parachains.collators]]
name = "collator1"
ws_port = 9910
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains.collators]]
name = "collator2"
ws_port = 9911
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains]]
id = 2000
chain = "penpal-kusama-2000"
cumulus_based = true
[[parachains.collators]]
name = "collator3"
ws_port = 9920
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains.collators]]
name = "collator4"
ws_port = 9921
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
# [[hrmpChannels]]
# sender = 1000
# recipient = 2000
# maxCapacity = 8
# maxMessageSize = 8192
# [[hrmpChannels]]
# sender = 2000
# recipient = 1000
# maxCapacity = 8
# maxMessageSize = 8192
@@ -0,0 +1,154 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9800
assets_parachain: &assets_parachain
wsPort: 9810
paraId: &ap_id 1000
penpal_parachain: &penpal_parachain
wsPort: 9820
paraId: &pp_id 2000
variables:
common:
xcm_version: &xcm_version '3'
require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000}
chains:
relay_chain:
signer: &rc_signer //Alice
assets_parachain_destination: &ap_dest { v3: { 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 Asset 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<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.SupportedVersionChanged
attributes:
- 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<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.SupportedVersionChanged
attributes:
- type: u32
value: *xcm_version
- extrinsics: # Asset 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 3200000000,
proofSize: 200000
}
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: *weight_at_most,
call: $ap_force_xcm_version
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: polkadotXcm.SupportedVersionChanged
chain: *assets_parachain
attributes:
- 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
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: polkadotXcm.SupportedVersionChanged
attributes:
- type: u32
value: *xcm_version
@@ -0,0 +1,266 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9800
assets_parachain: &assets_parachain
wsPort: 9810
paraId: &ap_id 1000
variables:
relay_chain:
signer: &rc_signer //Alice
wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F
assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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 {refTime: 1000000000, proofSize: 200000}
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
{ v3: [ *rc_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"162,909,000","proofSize":"0"}
- 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originType: Superuser,
requireWeightAtMost: *rc_weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: xcmPallet.Sent
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"1,015,234,000","proofSize":"200,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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originType: Native,
requireWeightAtMost: *rc_weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: system.ExtrinsicFailed
attributes:
- 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
{ v3: [ *rc_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
value: {"refTime":"2,000,000,000","proofSize":"0"}
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Incomplete
value: [{"refTime":"1,000,000,000","proofSize":"0"},"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
]
@@ -0,0 +1,205 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9800
assets_parachain: &assets_parachain
wsPort: 9810
paraId: &ap_id 1000
variables:
common:
amount: &amount 1000000000000
require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0}
relay_chain:
signer: &rc_signer //Alice
wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F
assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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 { v3: { parents: 1, interior: { here: true }}}
assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { 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: DEPENDENCY | 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
{ v3: [ *rc_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
value: {"refTime":"3,000,000,000","proofSize":"0"}
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"162,909,000","proofSize":"0"}
- 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
{ v3: [ *ap_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"533,283,000","proofSize":"7,096"}
- name: ump.ExecutedUpward
chain: *relay_chain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
value: {"refTime":"4,000,000,000","proofSize":"0"}
- 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 dispatch 'send' call
actions:
- extrinsics:
- chain: *assets_parachain
signer: *ap_signer
pallet: polkadotXcm
call: send
args: [
*rc_dest, # destination
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
Transact: {
originType: Native,
requireWeightAtMost: *weight_at_most,
call: $system_remark
}
}
]
}
]
events:
- name: system.ExtrinsicFailed
attributes:
- 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
{ v3: [ *ap_ksm_fungible ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Error
value: Barrier
@@ -0,0 +1,132 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9800
assets_parachain: &assets_parachain
wsPort: 9810
paraId: &ap_id 1000
penpal_parachain: &penpal_parachain
wsPort: 9820
paraId: &pp_id 2000
variables:
common:
amount: &amount 2000000000000
require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 20000}
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 { v3: { 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 5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ
relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}}
penpal_parachain:
sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ
signer: &pp_signer //Alice
tests:
- name: HRMP
beforeEach:
- name: DEPENDENCY | 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: DEPENDENCY | 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: Open Penpal Parachain to Assets Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceOpenHrmpChannel
args: [
2000,
1000,
8,
8192
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: hrmp.HrmpChannelForceOpened
- name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain)
its:
- name: Open Assets Parachain to PenPal Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceOpenHrmpChannel
args: [
1000,
2000,
8,
8192
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: hrmp.HrmpChannelForceOpened
- name: hrmp.forceProcessHrmpOpen (make sure all the channels are open)
its:
- name: Make sure all the pending channels are open
actions:
- extrinsics:
- chain: *relay_chain
signer: *rc_signer
sudo: true
pallet: hrmp
call: forceProcessHrmpOpen
args: [ 2 ]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
@@ -0,0 +1,401 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9800
assets_parachain: &assets_parachain
wsPort: 9810
paraId: &ap_id 1000
penpal_parachain: &penpal_parachain
wsPort: 9820
paraId: &pp_id 2000
variables:
common:
mint_amount: &mint_amount 1000000000000
amount: &amount 1000000000000
require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000}
amount_to_send: &amount_to_send 500000000000
chains:
relay_chain:
signer: &rc_signer //Alice
assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}}
assets_parachain_dest_routed: &ap_dest_routed { v3: { 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 { v3: { 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_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }}
penpal_parachain:
sovereign_account: &pp_sovereign_sibl 13cKp89Msu7M2PiaCuuGr1BzAsD5V3vaVbDMs3YtjMZHdGwR
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
]
force_create_asset2:
chain: *assets_parachain
pallet: assets
call: forceCreate
args: [
*asset_id,
{ Id: *ap_wallet }, # owner
true, # isSufficient
*asset_ed # minBalance
]
tests:
- name: HRMP
describes:
- name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain
before:
- name: DEPENDENCY | 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
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: Unlimited
}
},
{
SetTopic: "0x0123456789012345678901234567891201234567890123456789012345678912"
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset
}
}
]
}
]
events:
- name: xcmPallet.Sent
- name: dmpQueue.ExecutedDownward
chain: *assets_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"1,218,405,000","proofSize":"20,000"}
- queries:
forced_created_asset:
chain: *assets_parachain
pallet: assets
call: asset
args: [ *asset_id ]
- asserts:
isSome:
args: [ $forced_created_asset ]
- name: DEPENDENCY | 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,
*mint_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
V3: {
parents: 0,
interior: {
X1: {
AccountId32: {
id: *pp_acc
}
}
}
}
},
{ # assets
V3: [
{
id: {
Concrete: {
parents: 0,
interior: {
X2: [
{
PalletInstance: *assets_pallet_id
},
{
GeneralIndex: *asset_id
}
]
}
}
},
fun: {
Fungible: *amount_to_send
}
}
]
},
0, # feeAssetItem
Unlimited # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"673,627,000","proofSize":"6,196"}
- 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
V3: {
parents: 0,
interior: {
X1: {
AccountId32: {
id: *pp_acc
}
}
}
}
},
{ # assets
V3: [
*ap_ksm_fungible
]
},
0, # feeAssetItem
Unlimited # weightLimit
]
events:
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
threshold: [10, 10]
value: {"refTime":"673,627,000","proofSize":"6,196"}
- name: balances.Endowed
attributes:
- type: AccountId32
value: *pp_sovereign_sibl
- name: balances.Endowed
attributes:
- type: u128
value: *amount
- name: polkadotXcm.send( assets.forceCreateAsset ) | 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
{
v3: [ #message
{
WithdrawAsset: [
{
id: {
concrete: {
parents: 0,
interior: {
X2: [
{ PalletInstance: *assets_pallet_id },
{ GeneralIndex: *asset_id }
]
}
}
},
fun: { fungible: *amount_to_send }}
]
},
{
BuyExecution: {
fees: { id: *suff_asset, fun: { fungible: *amount_to_send }},
weightLimit: Unlimited
}
},
{
Transact: {
originKind: SovereignAccount,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset2
}
},
{
RefundSurplus
},
{
DepositAsset: {
assets: { Wild: All },
beneficiary: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: , # None
id: *pp_acc
}
}
}}
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
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
- queries:
assets_balance_pp_sovereign_after:
chain: *assets_parachain
pallet: assets
call: account
args: [
*asset_id,
*pp_sovereign_sibl
]
forced_created_asset2:
chain: *assets_parachain
pallet: assets
call: asset
args: [ 3 ]
- asserts:
isSome:
args: [ $forced_created_asset2 ]
- 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
{
v3: [ #message
{
WithdrawAsset: [*ap_suff_asset_fungible_fail]
},
{
BuyExecution: {
fees: *ap_suff_asset_fungible_fail,
weightLimit: Unlimited
}
},
{
Transact: {
originKind: SovereignAccount,
requireWeightAtMost: *weight_at_most,
call: $force_create_asset2
}
}
]
}
]
events:
- name: xcmpQueue.Fail
chain: *assets_parachain
attributes:
- type: XcmV3TraitsError
value: FailedToTransactAsset
@@ -0,0 +1,71 @@
[relaychain]
default_command = "./bin/polkadot"
default_args = [ "-lparachain=debug", "-lxcm=trace" ]
chain = "polkadot-local"
[[relaychain.nodes]]
name = "alice"
ws_port = 9800
validator = true
[[relaychain.nodes]]
name = "bob"
ws_port = 9801
validator = true
[[relaychain.nodes]]
name = "charlie"
ws_port = 9802
validator = true
[[relaychain.nodes]]
name = "dave"
ws_port = 9803
validator = true
[[parachains]]
id = 1000
chain = "statemint-local"
cumulus_based = true
[[parachains.collators]]
name = "collator1"
ws_port = 9810
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains.collators]]
name = "collator2"
ws_port = 9811
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains]]
id = 2000
chain = "penpal-polkadot-2000"
cumulus_based = true
[[parachains.collators]]
name = "collator3"
ws_port = 9820
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
[[parachains.collators]]
name = "collator4"
ws_port = 9821
command = "./bin/polkadot-parachain"
args = [ "-lxcm=trace" ]
# [[hrmpChannels]]
# sender = 1000
# recipient = 2000
# maxCapacity = 8
# maxMessageSize = 8192
# [[hrmpChannels]]
# sender = 2000
# recipient = 1000
# maxCapacity = 8
# maxMessageSize = 8192
@@ -0,0 +1,106 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
xcm_version: &xcm_version '3'
chains:
accounts:
alice_signer: &alice_signer //Alice
decodedCalls:
ap_force_xcm_version:
chain: *collectives_parachain
pallet: polkadotXcm
call: forceXcmVersion
args: [
{ # location
parents: 1,
interior: Here
},
*xcm_version
]
tests:
- name: Initialize Chains
its:
- name: XCM supported versions between chains
actions:
- extrinsics: # Relay Chain sets supported version for Collectives Parachain
- chain: *relay_chain
sudo: true
signer: *alice_signer
pallet: xcmPallet
call: forceXcmVersion
args: [
{ # location
parents: 0,
interior: {
X1: {
Parachain: *cp_id
}
}
},
*xcm_version
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.SupportedVersionChanged
attributes:
- type: u32
value: *xcm_version
- extrinsics: # Collectives Parachain sets supported version for Relay Chain through it
- chain: *relay_chain
signer: *alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination
{
v3: [ # message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 2200000000, # 2_200_000_000
proofSize: 200000, # 200_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 200000000, # 200_000_000
proofSize: 0,
},
call: $ap_force_xcm_version
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: polkadotXcm.SupportedVersionChanged
chain: *collectives_parachain
attributes:
- type: u32
value: *xcm_version
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
@@ -0,0 +1,180 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
accounts:
alice_signer: &acc_alice_signer //Alice
alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5'
tests:
- name: Teleport assets from Relay Chain to Collectives Parachain successful.
before:
- name: Get the Alice balances on Relay & Collectives Chains.
actions:
- queries:
balance_rc_alice_1:
chain: *relay_chain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
balance_cp_alice_1:
chain: *collectives_parachain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
its:
- name: Teleport assets from Relay Chain to Collectives Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
pallet: xcmPallet
call: teleportAssets
args: [
{ v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination
{ v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary
{
v3: [
# {
# # TODO use a separate Assets to pay a fee, to receive an exact amount of assets on beneficiary account.
# # a call with two assets fails with an error right now.
# id: { concrete: { 0, interior: { here: true }}},
# fun: { fungible: 1000000000000 } # 1_000_000_000_000
# },
{
id: { concrete: { 0, interior: { here: true }}},
fun: { fungible: 20000000000000 } # 20_000_000_000_000
}
]
}, # assets
0, # feeAssetItem
]
events:
- name: xcmPallet.Attempted
chain: *relay_chain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- queries:
balance_rc_alice_2:
chain: *relay_chain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
balance_cp_alice_2:
chain: *collectives_parachain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
- name: Alice deposit check, balance decreased on Relay Chain, increased on Collectives.
actions:
- asserts:
balanceDecreased:
args: [
{
balances: {
before: $balance_rc_alice_1,
after: $balance_rc_alice_2,
}
}
]
balanceIncreased:
args: [
{
balances: {
before: $balance_cp_alice_1,
after: $balance_cp_alice_2,
}
}
]
- name: Teleport assets from Collectives Parachain to Relay Chain successful
actions:
- extrinsics:
- chain: *collectives_parachain
signer: *acc_alice_signer
pallet: polkadotXcm
call: teleportAssets
args: [
{ v3: { parents: 1, interior: { here: true }}}, # destination
{ v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary
{
v3: [
{
id: { concrete: { parents: 1, interior: { here: true }}},
fun: { fungible: 10000000000000 } # 10_000_000_000_000
}
]
}, # assets
0, # feeAssetItem
]
events:
- name: balances.Withdraw
attributes:
- type: AccountId32
key: who
value: *acc_alice_ss58
- type: u128
key: amount
value: 10000000000000
- name: polkadotXcm.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: balances.Withdraw
chain: *relay_chain
attributes:
- type: u128
key: amount
value: 10000000000000 # amount received and withdrawn from registry account
- name: ump.ExecutedUpward
chain: *relay_chain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- queries:
balance_rc_alice_3:
chain: *relay_chain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
balance_cp_alice_3:
chain: *collectives_parachain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
- name: Alice deposit check, balance decreased on Collectives, increased on Relay Chain.
actions:
- asserts:
balanceDecreased:
args: [
{
balances: {
before: $balance_cp_alice_2,
after: $balance_cp_alice_3,
}
}
]
balanceIncreased:
args: [
{
balances: {
before: $balance_rc_alice_2,
after: $balance_rc_alice_3,
}
}
]
# TODO (P2) assert Alice balance before and after teleport (see example in kick_member test)
# TODO (P1) test: teleport of non relay chain assets fails
@@ -0,0 +1,49 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
chains:
accounts:
alice_signer: &alice_signer //Alice
alice_account32: &alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5'
tests:
- name: Reserve assets from Relay Chain to Collectives Parachain fails
its:
- name: Reserve assets from Relay Chain to Collectives Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *alice_signer
pallet: xcmPallet
call: reserveTransferAssets
args: [
{ v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination
{ v3: { parents: 0, interior: { x1: { accountId32: { id: *alice_acc32 }}}}}, # beneficiary
{
v3: [
{
id: { concrete: { 0, interior: { here: true }}},
fun: { fungible: 20000000000000 } # 20_000_000_000_000
}
]
}, # assets
0, # feeAssetItem
]
events:
- name: xcmPallet.Attempted
chain: *relay_chain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Incomplete
@@ -0,0 +1,34 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
accounts:
alice_signer: &alice_signer //Alice
alice_account32: &cp_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
tests:
- name: Alice fails to join an the Alliance, since it is not initialized yet.
its:
- name: Alice joins alliance
actions:
- extrinsics: # Relay Chain sets supported version for Asset Parachain
- chain: *collectives_parachain
signer: *alice_signer
pallet: alliance
call: joinAlliance
args: []
events:
- name: system.ExtrinsicFailed
attributes:
- type: SpRuntimeDispatchError
key: dispatchError
# TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized
# issue - https://github.com/paritytech/parachains-integration-tests/issues/59
value: {"Module":{"index":"50","error":"0x00000000"}}
@@ -0,0 +1,280 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &coll_para_id 1001
variables:
accounts:
alice_signer: &acc_alice_signer //Alice
alice_account32: &acc_alice_acc32 "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"
liam_signer: &acc_liam_signer //Liam
liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221"
olivia_signer: &acc_olivia_signer //Olivia
olivia_account32: &acc_olivia_acc32 "0x24ee8a659c6716fe9f7cb4e9e028602aa12867654ca02737da9171b7ff697d5c"
noah_signer: &acc_noah_signer //Noah
noah_account32: &acc_noah_acc32 "0x9c6ad3bc3aa2f1b2e837898e6da9980445f7ef8b3eee0b8c8e305f8cfae68517"
emma_signer: &acc_emma_signer //Emma
emma_account32: &acc_emma_acc32 "0x8ac272b333ba1127c8db57fa777ec820b24598a236efa648caf0d26d86f64572"
james_signer: &acc_james_signer //James
james_account32: &acc_james_acc32 "0x9a52805151a0b5effc084af9264011139872a21a3950cb9ae0b2955c4bf92c18"
ava_signer: &acc_ava_signer //Ava
ava_account32: &acc_ava_acc32 "0x348ef0b8776adbc09c862ddc29b1d193b9e24738e54eea3b0609c83856dc101c"
mia_signer: &acc_mia_signer //Mia
mia_account32: &acc_mia_acc32 "0xaebf15374cf7e758d10232514c569a7abf81cc1b8f1e81a73dbc608a0e335264"
decodedCalls:
init_alliance_members:
chain: *collectives_parachain
pallet: alliance
call: initMembers
args: [
[
*acc_liam_acc32,
*acc_olivia_acc32,
*acc_noah_acc32,
*acc_emma_acc32,
*acc_james_acc32,
*acc_ava_acc32
],
[
*acc_mia_acc32
]
]
init_alliance_voting_members:
chain: *collectives_parachain
pallet: alliance
call: initMembers
args: [
[
*acc_liam_acc32,
*acc_olivia_acc32,
*acc_noah_acc32,
*acc_emma_acc32,
*acc_james_acc32,
*acc_ava_acc32,
*acc_mia_acc32
],
[]
]
disband:
chain: *collectives_parachain
pallet: alliance
call: disband
args: [
{
fellowMembers: 6,
allyMembers: 1
}
]
tests:
- name: Alliance initiated with the root call, second init call fails. Alliance disband and set again.
its:
- name: Alliance initiated, founders and fellows are set.
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination
{
v3: [ # message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 3000000000, # 3_000_000_000
proofSize: 2000000, # 2_000_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 1000000000, # 1_000_000_000
proofSize: 1000000, # 1_000_000
},
call: $init_alliance_members
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: alliance.MembersInitialized
chain: *collectives_parachain
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: Alliance init call fails.
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination
{
v3: [ # message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 3000000000, # 3_000_000_000
proofSize: 2000000, # 2_000_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 1000000000, # 1_000_000_000
proofSize: 1000000, # 1_000_000
},
call: $init_alliance_voting_members
}
}
]
}
]
events:
# TODO can not currently assert variant AllianceAlreadyInitialized, XCM Transact fails silently
# issue - https://github.com/paritytech/polkadot/issues/4623
# Next test with a disband call will fail, if this call does not fail,
# since a witness data from a disband call will be invalid.
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: Alliance disbanded and initialized again.
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination
{
v3: [ # message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 5000000000, # 3_000_000_000
proofSize: 1000000, # 1_000_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 3000000000, # 3_000_000_000
proofSize: 200000, # 200_000
},
call: $disband
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: alliance.AllianceDisbanded
chain: *collectives_parachain
attributes:
- type: u32
key: fellowMembers
value: 6
- type: u32
key: allyMembers
value: 1
- type: u32
key: unreserved
value: 0
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: Alliance initiated, founders and fellows are set.
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination
{
v3: [ # message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 3000000000, # 3_000_000_000
proofSize: 2000000, # 2_000_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 1000000000, # 1_000_000_000
proofSize: 1000000, # 1_000_000
},
call: $init_alliance_members
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: alliance.MembersInitialized
chain: *collectives_parachain
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
@@ -0,0 +1,34 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
accounts:
liam_signer: &acc_liam_signer //Liam
liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221"
tests:
- name: Liam fails to join an the Alliance, Liam is already a member.
its:
- name: Alice joins alliance
actions:
- extrinsics: # Relay Chain sets supported version for Asset Parachain
- chain: *collectives_parachain
signer: *acc_liam_signer
pallet: alliance
call: joinAlliance
args: []
events:
- name: system.ExtrinsicFailed
attributes:
- type: SpRuntimeDispatchError
key: dispatchError
# TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized
# issue - https://github.com/paritytech/parachains-integration-tests/issues/59
value: {"Module":{"index":"50","error":"0x02000000"}}
@@ -0,0 +1,185 @@
---
settings:
chains:
relay_chain: &relay_chain
wsPort: 9700
collectives_parachain: &collectives_parachain
wsPort: 9710
paraId: &cp_id 1001
variables:
init_teleport_amount: &init_teleport_amount 20000000000000 # 20_000_000_000_000
accounts:
alice_signer: &acc_alice_signer //Alice
treasury_account32: &acc_treasury_acc32 '0x6d6f646c70792f74727372790000000000000000000000000000000000000000'
alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5'
decodedCalls:
alliance_kick_member:
chain: *collectives_parachain
pallet: alliance
call: kickMember
args: [
{Id: *acc_alice_acc32}
]
tests:
- name: Member kicked out, deposited assets slashed and teleported to Relay Chain treasury.
before:
- name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Collectives Parachain
actions:
- extrinsics:
- chain: *relay_chain
signer: *acc_alice_signer
pallet: xcmPallet
call: limitedTeleportAssets
args: [
{ v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination
{ v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary
{ v3: [ { id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: *init_teleport_amount }} ] }, # assets
0, # feeAssetItem
{ unlimited: true } # weightLimit
]
events:
- name: xcmPallet.Attempted
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: balances.Deposit
chain: *collectives_parachain
attributes:
- type: AccountId32
key: who
value: *acc_alice_ss58
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- name: Get the balances of the Relay Chain's treasury & Collectives parachain's future alliance member
actions:
- queries:
balance_rc_treasury_before:
chain: *relay_chain
pallet: system
call: account
args: [ *acc_treasury_acc32 ]
balance_cp_alice_before:
chain: *collectives_parachain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
its:
- name: Alice joins alliance
actions:
- extrinsics:
- chain: *collectives_parachain
signer: *acc_alice_signer
pallet: alliance
call: joinAlliance
args: []
events:
- name: balances.Reserved
chain: *collectives_parachain
attributes:
- type: AccountId32
key: who
value: *acc_alice_ss58
- type: u128
key: amount
value: 10,000,000,000,000
- name: alliance.NewAllyJoined
attributes:
- type: AccountId32
key: ally
value: *acc_alice_ss58
- queries:
balance_cp_alice_after:
chain: *collectives_parachain
pallet: system
call: account
args: [ *acc_alice_acc32 ]
- name: Alice deposit check, balance decreased
actions:
- asserts:
balanceDecreased:
args: [
{
balances: {
before: $balance_cp_alice_before,
after: $balance_cp_alice_after,
}
# TODO (P3) set `amount` and `fee` for more strict assert
}
]
- name: Kick Alice from alliance
actions:
- extrinsics: # Asset Parachain sets supported version for Relay Chain through it
- chain: *relay_chain
signer: *acc_alice_signer
sudo: true
pallet: xcmPallet
call: send
args: [
{ v3: { parents: 0, interior: { x1: { parachain: *cp_id }}}}, # destination
{
v3: [ #message
{
UnpaidExecution: {
weightLimit: {
limited: {
refTime: 4000000000, # 4_000_000_000
proofSize: 2000000, # 2_000_000
},
}
}
},
{
Transact: {
originKind: Superuser,
requireWeightAtMost: {
refTime: 2000000000, # 2_000_000_000
proofSize: 1000000, # 1_000_000
},
call: $alliance_kick_member
}
}
]
}
]
events:
- name: sudo.Sudid
attributes:
- type: Result<Null, SpRuntimeDispatchError>
value: Ok
- name: xcmPallet.Sent
- name: alliance.MemberKicked
chain: *collectives_parachain
attributes:
- type: AccountId32
key: member
value: *acc_alice_ss58
- name: dmpQueue.ExecutedDownward
chain: *collectives_parachain
attributes:
- type: XcmV3TraitsOutcome
xcmOutcome: Complete
- queries:
balance_rc_treasury_after:
chain: *relay_chain
pallet: system
call: account
args: [ *acc_treasury_acc32 ]
- name: Slashed balance appears on the relay chain treasury account
actions:
- asserts:
balanceIncreased:
args: [
{
balances: {
before: $balance_rc_treasury_before,
after: $balance_rc_treasury_after,
}
# TODO (P3) set `amount` and `fee` for more strict assert
}
]
@@ -0,0 +1,41 @@
[relaychain]
default_command = "./bin/polkadot"
default_args = [ "-lparachain=trace", "-lxcm=trace" ]
chain = "polkadot-local"
[[relaychain.nodes]]
name = "alice"
ws_port = 9700
validator = true
[[relaychain.nodes]]
name = "bob"
ws_port = 9701
validator = true
[[relaychain.nodes]]
name = "charlie"
ws_port = 9702
validator = true
[[relaychain.nodes]]
name = "dave"
ws_port = 9703
validator = true
[[parachains]]
id = 1001
chain = "collectives-polkadot-local"
cumulus_based = true
[[parachains.collators]]
name = "collator1"
ws_port = 9710
command = "./bin/polkadot-parachain"
args = ["-lxcm=trace"]
[[parachains.collators]]
name = "collator2"
ws_port = 9711
command = "./bin/polkadot-parachain"
args = ["-lxcm=trace"]