1
// Copyright 2025 Moonbeam foundation
2
// This file is part of Moonbeam.
3

            
4
// Moonbeam is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8

            
9
// Moonbeam is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13

            
14
// You should have received a copy of the GNU General Public License
15
// along with Moonbeam.  If not, see <http://www.gnu.org/licenses/>.
16

            
17
//! Westend AssetHub pallet and call indices
18
//!
19
//! These indices have been verified against the actual Westend AssetHub runtime metadata.
20
//!
21
//! ## Verification
22
//!
23
//! Verified using:
24
//! ```bash
25
//! subxt metadata --url wss://westend-asset-hub-rpc.polkadot.io:443 --format json
26
//! ```
27
//!
28
//! ## Sources
29
//! - Runtime: Westend AssetHub (asset-hub-westend)
30
//! - Metadata version: V16
31
//! - Last verified: 2025-11-14
32

            
33
use pallet_xcm_transactor::chain_indices::AssetHubIndices;
34
use parity_scale_codec::{Decode, Encode};
35
use sp_runtime::traits::{AccountIdLookup, StaticLookup};
36
use sp_runtime::AccountId32;
37
use sp_std::vec::Vec;
38

            
39
/// Westend AssetHub pallet and extrinsic indices
40
///
41
/// All indices have been verified against live Westend AssetHub metadata.
42
///
43
/// **NOTE**: Westend has different pallet indices than Polkadot/Kusama:
44
/// - Staking is at index 80 (not 89)
45
/// - NominationPools is at index 81 (not 80)
46
/// - DelegatedStaking is at index 84 (not 83)
47
pub const WESTEND_ASSETHUB_INDICES: AssetHubIndices = AssetHubIndices {
48
	// Pallet indices (from AssetHub Westend runtime metadata)
49
	// NOTE: Different from Polkadot/Kusama
50
	utility: 40,
51
	proxy: 42,
52
	staking: 80,           // Different from Polkadot (89)
53
	nomination_pools: 81,  // Different from Polkadot (80)
54
	delegated_staking: 84, // Different from Polkadot (83)
55
	assets: 50,
56
	nfts: 52,
57

            
58
	// Utility call indices (same as Polkadot/Kusama)
59
	as_derivative: 1,
60
	batch: 0,
61
	batch_all: 2,
62

            
63
	// Proxy call indices (same as Polkadot/Kusama)
64
	proxy_call: 0,
65
	add_proxy: 1,
66
	remove_proxy: 2,
67

            
68
	// Staking call indices (same as Polkadot/Kusama)
69
	bond: 0,
70
	bond_extra: 1,
71
	unbond: 2,
72
	withdraw_unbonded: 3,
73
	validate: 4,
74
	nominate: 5,
75
	chill: 6,
76
	set_payee: 7,
77
	set_controller: 8, // Deprecated but present
78
	rebond: 19,
79
};
80

            
81
/// Root-level call enum for Westend AssetHub
82
/// NOTE: Westend uses index 80 for Staking (different from Polkadot/Kusama which use 89)
83
#[derive(Encode, Decode)]
84
pub enum AssetHubCall {
85
	#[codec(index = 80u8)]
86
	Staking(StakeCall),
87
}
88

            
89
/// Staking pallet call enum for Westend AssetHub
90
#[derive(Encode, Decode)]
91
pub enum StakeCall {
92
	#[codec(index = 0u16)]
93
	Bond(
94
		#[codec(compact)] u128,
95
		pallet_staking::RewardDestination<AccountId32>,
96
	),
97
	#[codec(index = 1u16)]
98
	BondExtra(#[codec(compact)] u128),
99
	#[codec(index = 2u16)]
100
	Unbond(#[codec(compact)] u128),
101
	#[codec(index = 3u16)]
102
	WithdrawUnbonded(u32),
103
	#[codec(index = 4u16)]
104
	Validate(pallet_staking::ValidatorPrefs),
105
	#[codec(index = 5u16)]
106
	Nominate(Vec<<AccountIdLookup<AccountId32, ()> as StaticLookup>::Source>),
107
	#[codec(index = 6u16)]
108
	Chill,
109
	#[codec(index = 7u16)]
110
	SetPayee(pallet_staking::RewardDestination<AccountId32>),
111
	#[codec(index = 8u16)]
112
	SetController,
113
	#[codec(index = 19u16)]
114
	Rebond(#[codec(compact)] u128),
115
}
116

            
117
pub struct WestendAssetHubEncoder;
118

            
119
impl xcm_primitives::StakeEncodeCall<()> for WestendAssetHubEncoder {
120
10
	fn encode_call(_transactor: (), call: xcm_primitives::AvailableStakeCalls) -> Vec<u8> {
121
10
		match call {
122
1
			xcm_primitives::AvailableStakeCalls::Bond(b, c) => {
123
1
				AssetHubCall::Staking(StakeCall::Bond(b, c)).encode()
124
			}
125

            
126
1
			xcm_primitives::AvailableStakeCalls::BondExtra(a) => {
127
1
				AssetHubCall::Staking(StakeCall::BondExtra(a)).encode()
128
			}
129

            
130
1
			xcm_primitives::AvailableStakeCalls::Unbond(a) => {
131
1
				AssetHubCall::Staking(StakeCall::Unbond(a)).encode()
132
			}
133

            
134
1
			xcm_primitives::AvailableStakeCalls::WithdrawUnbonded(a) => {
135
1
				AssetHubCall::Staking(StakeCall::WithdrawUnbonded(a)).encode()
136
			}
137

            
138
1
			xcm_primitives::AvailableStakeCalls::Validate(a) => {
139
1
				AssetHubCall::Staking(StakeCall::Validate(a)).encode()
140
			}
141

            
142
			xcm_primitives::AvailableStakeCalls::Chill => {
143
1
				AssetHubCall::Staking(StakeCall::Chill).encode()
144
			}
145

            
146
1
			xcm_primitives::AvailableStakeCalls::SetPayee(a) => {
147
1
				AssetHubCall::Staking(StakeCall::SetPayee(a.into())).encode()
148
			}
149

            
150
			xcm_primitives::AvailableStakeCalls::SetController => {
151
1
				AssetHubCall::Staking(StakeCall::SetController).encode()
152
			}
153

            
154
1
			xcm_primitives::AvailableStakeCalls::Rebond(a) => {
155
1
				AssetHubCall::Staking(StakeCall::Rebond(a.into())).encode()
156
			}
157

            
158
1
			xcm_primitives::AvailableStakeCalls::Nominate(a) => {
159
1
				let nominated: Vec<<AccountIdLookup<AccountId32, ()> as StaticLookup>::Source> =
160
2
					a.iter().map(|add| (*add).clone().into()).collect();
161
1

            
162
1
				AssetHubCall::Staking(StakeCall::Nominate(nominated)).encode()
163
			}
164
		}
165
10
	}
166
}
167

            
168
#[cfg(test)]
169
mod tests {
170
	use super::*;
171
	use crate::westend::WestendAssetHubEncoder;
172

            
173
	use xcm_primitives::StakeEncodeCall;
174

            
175
	#[test]
176
1
	fn test_stake_bond() {
177
1
		let controller: AccountId32 = [1u8; 32].into();
178
1

            
179
1
		// Expected encoding: [pallet_index, call_index, ...call_data]
180
1
		// Pallet: 80 (Staking on Westend AssetHub)
181
1
		// Call: 0 (bond)
182
1
		let mut expected_encoded: Vec<u8> = Vec::new();
183
1
		expected_encoded.push(80u8); // Staking pallet index
184
1

            
185
1
		let mut expected = StakeCall::Bond(
186
1
			100u32.into(),
187
1
			pallet_staking::RewardDestination::Account(controller.clone()),
188
1
		)
189
1
		.encode();
190
1
		expected_encoded.append(&mut expected);
191
1

            
192
1
		assert_eq!(
193
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
194
1
				(),
195
1
				xcm_primitives::AvailableStakeCalls::Bond(
196
1
					100u32.into(),
197
1
					pallet_staking::RewardDestination::Account(controller.clone()),
198
1
				)
199
1
			),
200
1
			expected_encoded.clone()
201
1
		);
202

            
203
1
		sp_io::TestExternalities::default().execute_with(|| {
204
1
			// Pallet-xcm-transactor encoder returns same result when configured
205
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
206
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
207
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
208
1
					WESTEND_ASSETHUB_INDICES,
209
1
				),
210
1
			);
211
1
			assert_eq!(
212
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
213
1
					moonbase_runtime::xcm_config::Transactors,
214
1
				>>::encode_call(
215
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
216
1
					xcm_primitives::AvailableStakeCalls::Bond(
217
1
						100u32.into(),
218
1
						pallet_staking::RewardDestination::Account(controller),
219
1
					)
220
1
				),
221
1
				expected_encoded
222
1
			);
223
1
		});
224
1
	}
225

            
226
	#[test]
227
1
	fn test_stake_bond_extra() {
228
1
		// Expected encoding: [pallet_index, call_index, ...call_data]
229
1
		let mut expected_encoded: Vec<u8> = Vec::new();
230
1
		expected_encoded.push(80u8); // Staking pallet index
231
1

            
232
1
		let mut expected = StakeCall::BondExtra(100u32.into()).encode();
233
1
		expected_encoded.append(&mut expected);
234
1

            
235
1
		assert_eq!(
236
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
237
1
				(),
238
1
				xcm_primitives::AvailableStakeCalls::BondExtra(100u32.into())
239
1
			),
240
1
			expected_encoded.clone()
241
1
		);
242

            
243
1
		sp_io::TestExternalities::default().execute_with(|| {
244
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
245
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
246
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
247
1
					WESTEND_ASSETHUB_INDICES,
248
1
				),
249
1
			);
250
1
			assert_eq!(
251
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
252
1
					moonbase_runtime::xcm_config::Transactors,
253
1
				>>::encode_call(
254
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
255
1
					xcm_primitives::AvailableStakeCalls::BondExtra(100u32.into())
256
1
				),
257
1
				expected_encoded
258
1
			);
259
1
		});
260
1
	}
261

            
262
	#[test]
263
1
	fn test_stake_unbond() {
264
1
		let mut expected_encoded: Vec<u8> = Vec::new();
265
1
		expected_encoded.push(80u8);
266
1

            
267
1
		let mut expected = StakeCall::Unbond(100u32.into()).encode();
268
1
		expected_encoded.append(&mut expected);
269
1

            
270
1
		assert_eq!(
271
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
272
1
				(),
273
1
				xcm_primitives::AvailableStakeCalls::Unbond(100u32.into())
274
1
			),
275
1
			expected_encoded.clone()
276
1
		);
277

            
278
1
		sp_io::TestExternalities::default().execute_with(|| {
279
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
280
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
281
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
282
1
					WESTEND_ASSETHUB_INDICES,
283
1
				),
284
1
			);
285
1
			assert_eq!(
286
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
287
1
					moonbase_runtime::xcm_config::Transactors,
288
1
				>>::encode_call(
289
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
290
1
					xcm_primitives::AvailableStakeCalls::Unbond(100u32.into())
291
1
				),
292
1
				expected_encoded
293
1
			);
294
1
		});
295
1
	}
296

            
297
	#[test]
298
1
	fn test_stake_withdraw_unbonded() {
299
1
		let mut expected_encoded: Vec<u8> = Vec::new();
300
1
		expected_encoded.push(80u8);
301
1

            
302
1
		let mut expected = StakeCall::WithdrawUnbonded(100u32).encode();
303
1
		expected_encoded.append(&mut expected);
304
1

            
305
1
		assert_eq!(
306
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
307
1
				(),
308
1
				xcm_primitives::AvailableStakeCalls::WithdrawUnbonded(100u32,)
309
1
			),
310
1
			expected_encoded.clone()
311
1
		);
312

            
313
1
		sp_io::TestExternalities::default().execute_with(|| {
314
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
315
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
316
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
317
1
					WESTEND_ASSETHUB_INDICES,
318
1
				),
319
1
			);
320
1
			assert_eq!(
321
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
322
1
					moonbase_runtime::xcm_config::Transactors,
323
1
				>>::encode_call(
324
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
325
1
					xcm_primitives::AvailableStakeCalls::WithdrawUnbonded(100u32,)
326
1
				),
327
1
				expected_encoded
328
1
			);
329
1
		});
330
1
	}
331

            
332
	#[test]
333
1
	fn test_stake_validate() {
334
1
		let mut expected_encoded: Vec<u8> = Vec::new();
335
1
		expected_encoded.push(80u8);
336
1

            
337
1
		let mut expected = StakeCall::Validate(pallet_staking::ValidatorPrefs::default()).encode();
338
1
		expected_encoded.append(&mut expected);
339
1

            
340
1
		assert_eq!(
341
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
342
1
				(),
343
1
				xcm_primitives::AvailableStakeCalls::Validate(
344
1
					pallet_staking::ValidatorPrefs::default()
345
1
				)
346
1
			),
347
1
			expected_encoded.clone()
348
1
		);
349

            
350
1
		sp_io::TestExternalities::default().execute_with(|| {
351
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
352
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
353
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
354
1
					WESTEND_ASSETHUB_INDICES,
355
1
				),
356
1
			);
357
1
			assert_eq!(
358
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
359
1
					moonbase_runtime::xcm_config::Transactors,
360
1
				>>::encode_call(
361
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
362
1
					xcm_primitives::AvailableStakeCalls::Validate(
363
1
						pallet_staking::ValidatorPrefs::default()
364
1
					)
365
1
				),
366
1
				expected_encoded
367
1
			);
368
1
		});
369
1
	}
370

            
371
	#[test]
372
1
	fn test_stake_nominate() {
373
1
		let mut expected_encoded: Vec<u8> = Vec::new();
374
1
		expected_encoded.push(80u8);
375
1

            
376
1
		let account1: AccountId32 = [1u8; 32].into();
377
1
		let account2: AccountId32 = [2u8; 32].into();
378
1
		let targets = vec![account1.clone(), account2.clone()];
379
1

            
380
1
		let nominated: Vec<<AccountIdLookup<AccountId32, ()> as StaticLookup>::Source> =
381
2
			targets.iter().map(|add| (*add).clone().into()).collect();
382
1

            
383
1
		let mut expected = StakeCall::Nominate(nominated).encode();
384
1
		expected_encoded.append(&mut expected);
385
1

            
386
1
		assert_eq!(
387
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
388
1
				(),
389
1
				xcm_primitives::AvailableStakeCalls::Nominate(targets.clone())
390
1
			),
391
1
			expected_encoded.clone()
392
1
		);
393

            
394
1
		sp_io::TestExternalities::default().execute_with(|| {
395
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
396
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
397
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
398
1
					WESTEND_ASSETHUB_INDICES,
399
1
				),
400
1
			);
401
1
			assert_eq!(
402
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
403
1
					moonbase_runtime::xcm_config::Transactors,
404
1
				>>::encode_call(
405
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
406
1
					xcm_primitives::AvailableStakeCalls::Nominate(targets)
407
1
				),
408
1
				expected_encoded
409
1
			);
410
1
		});
411
1
	}
412

            
413
	#[test]
414
1
	fn test_stake_chill() {
415
1
		let mut expected_encoded: Vec<u8> = Vec::new();
416
1
		expected_encoded.push(80u8);
417
1

            
418
1
		let mut expected = StakeCall::Chill.encode();
419
1
		expected_encoded.append(&mut expected);
420
1

            
421
1
		assert_eq!(
422
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
423
1
				(),
424
1
				xcm_primitives::AvailableStakeCalls::Chill
425
1
			),
426
1
			expected_encoded.clone()
427
1
		);
428

            
429
1
		sp_io::TestExternalities::default().execute_with(|| {
430
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
431
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
432
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
433
1
					WESTEND_ASSETHUB_INDICES,
434
1
				),
435
1
			);
436
1
			assert_eq!(
437
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
438
1
					moonbase_runtime::xcm_config::Transactors,
439
1
				>>::encode_call(
440
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
441
1
					xcm_primitives::AvailableStakeCalls::Chill
442
1
				),
443
1
				expected_encoded
444
1
			);
445
1
		});
446
1
	}
447

            
448
	#[test]
449
1
	fn test_set_payee() {
450
1
		let mut expected_encoded: Vec<u8> = Vec::new();
451
1
		expected_encoded.push(80u8);
452
1

            
453
1
		let controller: AccountId32 = [1u8; 32].into();
454
1
		let mut expected = StakeCall::SetPayee(pallet_staking::RewardDestination::Account(
455
1
			controller.clone(),
456
1
		))
457
1
		.encode();
458
1
		expected_encoded.append(&mut expected);
459
1

            
460
1
		assert_eq!(
461
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
462
1
				(),
463
1
				xcm_primitives::AvailableStakeCalls::SetPayee(
464
1
					pallet_staking::RewardDestination::Account(controller.clone()).into()
465
1
				)
466
1
			),
467
1
			expected_encoded.clone()
468
1
		);
469

            
470
1
		sp_io::TestExternalities::default().execute_with(|| {
471
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
472
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
473
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
474
1
					WESTEND_ASSETHUB_INDICES,
475
1
				),
476
1
			);
477
1
			assert_eq!(
478
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
479
1
					moonbase_runtime::xcm_config::Transactors,
480
1
				>>::encode_call(
481
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
482
1
					xcm_primitives::AvailableStakeCalls::SetPayee(
483
1
						pallet_staking::RewardDestination::Account(controller).into()
484
1
					)
485
1
				),
486
1
				expected_encoded
487
1
			);
488
1
		});
489
1
	}
490

            
491
	#[test]
492
1
	fn test_set_controller() {
493
1
		let mut expected_encoded: Vec<u8> = Vec::new();
494
1
		expected_encoded.push(80u8);
495
1

            
496
1
		let mut expected = StakeCall::SetController.encode();
497
1
		expected_encoded.append(&mut expected);
498
1

            
499
1
		assert_eq!(
500
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
501
1
				(),
502
1
				xcm_primitives::AvailableStakeCalls::SetController
503
1
			),
504
1
			expected_encoded.clone()
505
1
		);
506

            
507
1
		sp_io::TestExternalities::default().execute_with(|| {
508
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
509
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
510
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
511
1
					WESTEND_ASSETHUB_INDICES,
512
1
				),
513
1
			);
514
1
			assert_eq!(
515
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
516
1
					moonbase_runtime::xcm_config::Transactors,
517
1
				>>::encode_call(
518
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
519
1
					xcm_primitives::AvailableStakeCalls::SetController
520
1
				),
521
1
				expected_encoded
522
1
			);
523
1
		});
524
1
	}
525

            
526
	#[test]
527
1
	fn test_rebond() {
528
1
		let mut expected_encoded: Vec<u8> = Vec::new();
529
1
		expected_encoded.push(80u8);
530
1

            
531
1
		let mut expected = StakeCall::Rebond(100u32.into()).encode();
532
1
		expected_encoded.append(&mut expected);
533
1

            
534
1
		assert_eq!(
535
1
			<WestendAssetHubEncoder as StakeEncodeCall<()>>::encode_call(
536
1
				(),
537
1
				xcm_primitives::AvailableStakeCalls::Rebond(100u32.into())
538
1
			),
539
1
			expected_encoded.clone()
540
1
		);
541

            
542
1
		sp_io::TestExternalities::default().execute_with(|| {
543
1
			pallet_xcm_transactor::ChainIndicesMap::<moonbase_runtime::Runtime>::insert(
544
1
				moonbase_runtime::xcm_config::Transactors::AssetHub,
545
1
				pallet_xcm_transactor::chain_indices::ChainIndices::AssetHub(
546
1
					WESTEND_ASSETHUB_INDICES,
547
1
				),
548
1
			);
549
1
			assert_eq!(
550
1
				<pallet_xcm_transactor::Pallet::<moonbase_runtime::Runtime> as StakeEncodeCall<
551
1
					moonbase_runtime::xcm_config::Transactors,
552
1
				>>::encode_call(
553
1
					moonbase_runtime::xcm_config::Transactors::AssetHub,
554
1
					xcm_primitives::AvailableStakeCalls::Rebond(100u32.into())
555
1
				),
556
1
				expected_encoded
557
1
			);
558
1
		});
559
1
	}
560
}