From 8610656884c97b2399042718074c9fe60a50fdd9 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 9 Mar 2022 16:35:46 +0300 Subject: [PATCH] added no_stack_overflow_when_decoding_nested_call_during_dispatch test (#1349) --- .../bin/rialto/runtime/src/millau_messages.rs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/bridges/bin/rialto/runtime/src/millau_messages.rs b/bridges/bin/rialto/runtime/src/millau_messages.rs index 9c5d9c8012c..483fa1d56e8 100644 --- a/bridges/bin/rialto/runtime/src/millau_messages.rs +++ b/bridges/bin/rialto/runtime/src/millau_messages.rs @@ -476,4 +476,69 @@ mod tests { .0, ); } + + #[test] + #[ignore] + fn no_stack_overflow_when_decoding_nested_call_during_dispatch() { + // this test is normally ignored, because it only makes sense to run it in release mode + + let mut ext: sp_io::TestExternalities = + SystemConfig::default().build_storage::().unwrap().into(); + ext.execute_with(|| { + let bridge = MILLAU_CHAIN_ID; + + let mut call: Call = SystemCall::set_heap_pages { pages: 64 }.into(); + + for _i in 0..3000 { + call = Call::Sudo(pallet_sudo::Call::sudo { call: Box::new(call) }); + } + + let dispatch_weight = 500; + let dispatch_fee = ::WeightToFee::calc( + &dispatch_weight, + ); + assert!(dispatch_fee > 0); + + // create relayer account with minimal balance + let relayer_account: AccountId = [1u8; 32].into(); + let initial_amount = ExistentialDeposit::get(); + let _ = as Currency>::deposit_creating( + &relayer_account, + initial_amount, + ); + + // create dispatch account with minimal balance + dispatch fee + let dispatch_account = derive_account_id::< + ::SourceChainAccountId, + >(bridge, SourceAccount::Root); + let dispatch_account = + ::AccountIdConverter::convert( + dispatch_account, + ); + let _ = as Currency>::deposit_creating( + &dispatch_account, + initial_amount + dispatch_fee, + ); + + // dispatch message with intention to pay dispatch fee at the target chain + // + // this is where the stack overflow has happened before the fix has been applied + FromMillauMessageDispatch::dispatch( + &relayer_account, + DispatchMessage { + key: MessageKey { lane_id: Default::default(), nonce: 0 }, + data: DispatchMessageData { + payload: Ok(FromBridgedChainMessagePayload:: { + spec_version: VERSION.spec_version, + weight: dispatch_weight, + origin: CallOrigin::SourceRoot, + dispatch_fee_payment: DispatchFeePayment::AtTargetChain, + call: FromBridgedChainEncodedMessageCall::new(call.encode()), + }), + fee: 1, + }, + }, + ); + }); + } }