Skip to content
This repository was archived by the owner on Aug 15, 2025. It is now read-only.

Commit bcd4a6d

Browse files
Merge pull request #34 from Snowfork/alistair/asset-transfer-to-penpal
Asset transfer to penpal
2 parents 52bcb07 + a0c2f3a commit bcd4a6d

File tree

12 files changed

+226
-37
lines changed

12 files changed

+226
-37
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ decl_test_parachains! {
4242
pallets = {
4343
PolkadotXcm: penpal_runtime::PolkadotXcm,
4444
Assets: penpal_runtime::Assets,
45+
ForeignAssets: penpal_runtime::ForeignAssets,
4546
Balances: penpal_runtime::Balances,
4647
}
4748
},
@@ -59,6 +60,7 @@ decl_test_parachains! {
5960
pallets = {
6061
PolkadotXcm: penpal_runtime::PolkadotXcm,
6162
Assets: penpal_runtime::Assets,
63+
ForeignAssets: penpal_runtime::ForeignAssets,
6264
Balances: penpal_runtime::Balances,
6365
}
6466
},

cumulus/parachains/integration-tests/emulated/networks/rococo-wococo-system/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset
1616
asset-hub-wococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-wococo" }
1717
bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" }
1818
bridge-hub-wococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-wococo" }
19+
penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" }

cumulus/parachains/integration-tests/emulated/networks/rococo-wococo-system/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ pub use asset_hub_rococo_emulated_chain;
1717
pub use asset_hub_wococo_emulated_chain;
1818
pub use bridge_hub_rococo_emulated_chain;
1919
pub use bridge_hub_wococo_emulated_chain;
20+
pub use penpal_emulated_chain;
2021
pub use rococo_emulated_chain;
2122
pub use wococo_emulated_chain;
2223

2324
use asset_hub_rococo_emulated_chain::AssetHubRococo;
2425
use asset_hub_wococo_emulated_chain::AssetHubWococo;
2526
use bridge_hub_rococo_emulated_chain::BridgeHubRococo;
2627
use bridge_hub_wococo_emulated_chain::BridgeHubWococo;
28+
use penpal_emulated_chain::PenpalA;
2729
use rococo_emulated_chain::Rococo;
2830
use wococo_emulated_chain::Wococo;
2931

@@ -43,6 +45,7 @@ decl_test_networks! {
4345
parachains = vec![
4446
AssetHubRococo,
4547
BridgeHubRococo,
48+
PenpalA,
4649
],
4750
bridge = RococoWococoMockBridge
4851

@@ -90,5 +93,6 @@ decl_test_sender_receiver_accounts_parameter_types! {
9093
BridgeHubRococoPara { sender: ALICE, receiver: BOB },
9194
WococoRelay { sender: ALICE, receiver: BOB },
9295
AssetHubWococoPara { sender: ALICE, receiver: BOB },
93-
BridgeHubWococoPara { sender: ALICE, receiver: BOB }
96+
BridgeHubWococoPara { sender: ALICE, receiver: BOB },
97+
PenpalAPara { sender: ALICE, receiver: BOB }
9498
}

cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ emulated-integration-tests-common = { path = "../../../common", default-features
3939
rococo-wococo-system-emulated-network = { path = "../../../networks/rococo-wococo-system" }
4040
bridge-hub-rococo-emulated-chain = { path = "../../../chains/parachains/bridges/bridge-hub-rococo"}
4141
asset-hub-rococo-emulated-chain = { path = "../../../chains/parachains/assets/asset-hub-rococo"}
42+
penpal-emulated-chain = { path = "../../../chains/parachains/testing/penpal" }
4243

4344
# Snowbridge
4445
snowbridge-core = { path = "../../../../../../../../parachain/primitives/core", default-features = false }

cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,14 @@ pub use rococo_wococo_system_emulated_network::{
4343
bridge_hub_rococo_emulated_chain::{
4444
genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet,
4545
},
46+
penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet,
4647
rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet},
4748
AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver,
4849
AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWococoPara as AssetHubWococo,
4950
BridgeHubRococoPara as BridgeHubRococo, BridgeHubRococoParaReceiver as BridgeHubRococoReceiver,
5051
BridgeHubRococoParaSender as BridgeHubRococoSender, BridgeHubWococoPara as BridgeHubWococo,
51-
RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver,
52-
RococoRelaySender as RococoSender,
52+
PenpalAPara as PenpalA, PenpalAParaSender as PenpalASender, PenpalAParaReceiver as PenpalAReceiver,
53+
RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender,
5354
};
5455

5556
pub const ASSET_ID: u32 = 1;

cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs

Lines changed: 115 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,10 @@ use sp_core::H256;
2525

2626
const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED;
2727
const CHAIN_ID: u64 = 15;
28-
const DEST_PARA_ID: u32 = 1000;
28+
const ASSETHUB_PARA_ID: u32 = 1000;
2929
const TREASURY_ACCOUNT: [u8; 32] =
3030
hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000");
3131
const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d");
32-
const ASSETHUB_SOVEREIGN: [u8; 32] =
33-
hex!("7369626ce8030000000000000000000000000000000000000000000000000000");
3432
const ETHEREUM_DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e");
3533

3634
#[test]
@@ -188,7 +186,7 @@ fn register_token() {
188186
BridgeHubRococo::fund_accounts(vec![(
189187
BridgeHubRococo::sovereign_account_id_of(MultiLocation {
190188
parents: 1,
191-
interior: X1(Parachain(DEST_PARA_ID)),
189+
interior: X1(Parachain(ASSETHUB_PARA_ID)),
192190
}),
193191
INITIAL_FUND,
194192
)]);
@@ -204,7 +202,7 @@ fn register_token() {
204202
command: Command::RegisterToken { token: WETH.into() },
205203
});
206204
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
207-
let _ = EthereumInboundQueue::send_xcm(xcm, DEST_PARA_ID.into()).unwrap();
205+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
208206

209207
assert_expected_events!(
210208
BridgeHubRococo,
@@ -227,21 +225,47 @@ fn register_token() {
227225
}
228226

229227
#[test]
230-
fn send_token() {
231-
BridgeHubRococo::fund_accounts(vec![(
232-
BridgeHubRococo::sovereign_account_id_of(MultiLocation {
228+
fn send_token_to_penpal() {
229+
let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(
230+
MultiLocation {
233231
parents: 1,
234-
interior: X1(Parachain(DEST_PARA_ID)),
235-
}),
232+
interior: X1(Parachain(ASSETHUB_PARA_ID)),
233+
}
234+
);
235+
BridgeHubRococo::fund_accounts(vec![(
236+
asset_hub_sovereign.clone(),
236237
INITIAL_FUND,
237238
)]);
238239

239240
// Fund ethereum sovereign in asset hub
240241
AssetHubRococo::fund_accounts(vec![
241-
(ASSETHUB_SOVEREIGN.into(), INITIAL_FUND),
242242
(AssetHubRococoReceiver::get(), INITIAL_FUND),
243243
]);
244244

245+
PenpalA::fund_accounts(vec![
246+
(PenpalAReceiver::get(), INITIAL_FUND),
247+
(PenpalASender::get(), INITIAL_FUND),
248+
]);
249+
250+
let weth_asset_id: MultiLocation = (
251+
Parent,
252+
Parent,
253+
Ethereum { chain_id: 15 },
254+
AccountKey20 { network: None, key: WETH }
255+
).into();
256+
257+
// Create asset on penpal.
258+
PenpalA::execute_with(|| {
259+
assert_ok!(<PenpalA as PenpalAPallet>::ForeignAssets::create(
260+
<PenpalA as Chain>::RuntimeOrigin::signed(PenpalASender::get()),
261+
weth_asset_id,
262+
asset_hub_sovereign.into(),
263+
1000,
264+
));
265+
266+
//assert!(<PenpalA as PenpalAPallet>::Assets::asset_exists(weth_asset_id));
267+
});
268+
245269
let message_id_: H256 = [1; 32].into();
246270

247271
BridgeHubRococo::execute_with(|| {
@@ -253,17 +277,17 @@ fn send_token() {
253277
command: Command::RegisterToken { token: WETH.into() },
254278
});
255279
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
256-
let _ = EthereumInboundQueue::send_xcm(xcm, DEST_PARA_ID.into()).unwrap();
280+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
257281
let message = VersionedMessage::V1(MessageV1 {
258282
chain_id: CHAIN_ID,
259283
command: Command::SendToken {
260284
token: WETH.into(),
261-
destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() },
285+
destination: Destination::ForeignAccountId32 { para_id: 2000, id: PenpalAReceiver::get().into() },
262286
amount: 1_000_000_000,
263287
},
264288
});
265289
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
266-
let _ = EthereumInboundQueue::send_xcm(xcm, DEST_PARA_ID.into()).unwrap();
290+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
267291

268292
assert_expected_events!(
269293
BridgeHubRococo,
@@ -278,6 +302,18 @@ fn send_token() {
278302

279303
assert_expected_events!(
280304
AssetHubRococo,
305+
vec![
306+
RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {},
307+
RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {},
308+
]
309+
);
310+
});
311+
312+
PenpalA::execute_with(|| {
313+
type RuntimeEvent = <PenpalA as Chain>::RuntimeEvent;
314+
315+
assert_expected_events!(
316+
PenpalA,
281317
vec![
282318
RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {},
283319
]
@@ -286,18 +322,77 @@ fn send_token() {
286322
}
287323

288324
#[test]
289-
fn reserve_transfer_token() {
325+
fn send_token() {
290326
BridgeHubRococo::fund_accounts(vec![(
291327
BridgeHubRococo::sovereign_account_id_of(MultiLocation {
292328
parents: 1,
293-
interior: X1(Parachain(DEST_PARA_ID)),
329+
interior: X1(Parachain(ASSETHUB_PARA_ID)),
294330
}),
295331
INITIAL_FUND,
296332
)]);
297333

298334
// Fund ethereum sovereign in asset hub
299335
AssetHubRococo::fund_accounts(vec![
300-
(ASSETHUB_SOVEREIGN.into(), INITIAL_FUND),
336+
(AssetHubRococoReceiver::get(), INITIAL_FUND),
337+
]);
338+
339+
let message_id_: H256 = [1; 32].into();
340+
341+
BridgeHubRococo::execute_with(|| {
342+
type RuntimeEvent = <BridgeHubRococo as Chain>::RuntimeEvent;
343+
type EthereumInboundQueue =
344+
<BridgeHubRococo as BridgeHubRococoPallet>::EthereumInboundQueue;
345+
let message = VersionedMessage::V1(MessageV1 {
346+
chain_id: CHAIN_ID,
347+
command: Command::RegisterToken { token: WETH.into() },
348+
});
349+
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
350+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
351+
let message = VersionedMessage::V1(MessageV1 {
352+
chain_id: CHAIN_ID,
353+
command: Command::SendToken {
354+
token: WETH.into(),
355+
destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() },
356+
amount: 1_000_000_000,
357+
},
358+
});
359+
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
360+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
361+
362+
assert_expected_events!(
363+
BridgeHubRococo,
364+
vec![
365+
RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {},
366+
]
367+
);
368+
});
369+
370+
AssetHubRococo::execute_with(|| {
371+
type RuntimeEvent = <AssetHubRococo as Chain>::RuntimeEvent;
372+
373+
assert_expected_events!(
374+
AssetHubRococo,
375+
vec![
376+
RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {},
377+
]
378+
);
379+
});
380+
}
381+
382+
#[test]
383+
fn reserve_transfer_token() {
384+
let assethub_sovereign = BridgeHubRococo::sovereign_account_id_of(
385+
MultiLocation {
386+
parents: 1,
387+
interior: X1(Parachain(ASSETHUB_PARA_ID)),
388+
}
389+
);
390+
391+
BridgeHubRococo::fund_accounts(vec![
392+
(assethub_sovereign.clone(), INITIAL_FUND)
393+
]);
394+
395+
AssetHubRococo::fund_accounts(vec![
301396
(AssetHubRococoReceiver::get(), INITIAL_FUND),
302397
]);
303398

@@ -313,7 +408,7 @@ fn reserve_transfer_token() {
313408
command: Command::RegisterToken { token: WETH.into() },
314409
});
315410
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
316-
let _ = EthereumInboundQueue::send_xcm(xcm, DEST_PARA_ID.into()).unwrap();
411+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
317412
let message = VersionedMessage::V1(MessageV1 {
318413
chain_id: CHAIN_ID,
319414
command: Command::SendToken {
@@ -323,7 +418,7 @@ fn reserve_transfer_token() {
323418
},
324419
});
325420
let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap();
326-
let _ = EthereumInboundQueue::send_xcm(xcm, DEST_PARA_ID.into()).unwrap();
421+
let _ = EthereumInboundQueue::send_xcm(xcm, ASSETHUB_PARA_ID.into()).unwrap();
327422

328423
assert_expected_events!(
329424
BridgeHubRococo,
@@ -402,7 +497,7 @@ fn reserve_transfer_token() {
402497
.find(|&event| matches!(
403498
event,
404499
RuntimeEvent::Balances(pallet_balances::Event::Deposit{ who, amount })
405-
if *who == ASSETHUB_SOVEREIGN.into() && *amount == 2200000000000
500+
if who == &assethub_sovereign && *amount == 2200000000000
406501
))
407502
.is_some(),
408503
"Assethub sovereign takes remote fee."

cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ parameter_types! {
527527
pub const CreateAssetCall: [u8;2] = [53, 0];
528528
pub const CreateAssetExecutionFee: u128 = 2_000_000_000;
529529
pub const CreateAssetDeposit: u128 = (UNITS / 10) + EXISTENTIAL_DEPOSIT;
530-
pub const SendTokenExecutionFee: u128 = 2_000_000_000;
530+
pub const SendTokenExecutionFee: u128 = 4_000_000_000;
531531
}
532532

533533
#[cfg(feature = "runtime-benchmarks")]

cumulus/parachains/runtimes/testing/penpal/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,12 @@ cumulus-primitives-utility = { path = "../../../../primitives/utility", default-
7575
pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false }
7676
parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false }
7777
parachains-common = { path = "../../../common", default-features = false }
78+
assets-common = { path = "../../assets/common", default-features = false }
7879

7980
[features]
8081
default = [ "std" ]
8182
std = [
83+
"assets-common/std",
8284
"codec/std",
8385
"cumulus-pallet-aura-ext/std",
8486
"cumulus-pallet-dmp-queue/std",
@@ -135,6 +137,7 @@ std = [
135137
]
136138

137139
runtime-benchmarks = [
140+
"assets-common/runtime-benchmarks",
138141
"cumulus-pallet-dmp-queue/runtime-benchmarks",
139142
"cumulus-pallet-parachain-system/runtime-benchmarks",
140143
"cumulus-pallet-session-benchmarking/runtime-benchmarks",

0 commit comments

Comments
 (0)