diff --git a/substrate/frame/revive/src/evm/runtime.rs b/substrate/frame/revive/src/evm/runtime.rs index 48380f83899bd..c6167608a5070 100644 --- a/substrate/frame/revive/src/evm/runtime.rs +++ b/substrate/frame/revive/src/evm/runtime.rs @@ -346,6 +346,7 @@ pub trait EthExtra { gas_limit, storage_deposit_limit, data, + storage_deposit_payer: None } .into() } @@ -601,7 +602,8 @@ mod test { value: tx.value.unwrap_or_default().as_u64().into(), data: tx.input.to_vec(), gas_limit, - storage_deposit_limit + storage_deposit_limit, + storage_deposit_payer: None } .into() ); diff --git a/substrate/frame/revive/src/impl_fungibles.rs b/substrate/frame/revive/src/impl_fungibles.rs index 404690c6765b4..47adf4fc8ca8e 100644 --- a/substrate/frame/revive/src/impl_fungibles.rs +++ b/substrate/frame/revive/src/impl_fungibles.rs @@ -81,6 +81,7 @@ where <::Currency as fungible::Inspect<_>>::total_issuance(), ), data, + None ); if let Ok(return_value) = result { if let Ok(eu256) = EU256::abi_decode_validate(&return_value.data) { @@ -117,6 +118,7 @@ where <::Currency as fungible::Inspect<_>>::total_issuance(), ), data, + None ); if let Ok(return_value) = result { if let Ok(eu256) = EU256::abi_decode_validate(&return_value.data) { @@ -192,6 +194,7 @@ where <::Currency as fungible::Inspect<_>>::total_issuance(), ), data, + None ); log::trace!(target: "whatiwant", "{gas_consumed}"); if let Ok(return_value) = result { @@ -229,6 +232,7 @@ where <::Currency as fungible::Inspect<_>>::total_issuance(), ), data, + None ); if let Ok(return_value) = result { if return_value.did_revert() { diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 11c69bfdfe9e3..7d731cbfb832c 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -707,7 +707,10 @@ pub mod pallet { gas_limit: Weight, #[pallet::compact] storage_deposit_limit: BalanceOf, data: Vec, + storage_deposit_payer: Option, ) -> DispatchResultWithPostInfo { + let payer_origin = storage_deposit_payer + .map(|p| frame_system::RawOrigin::Signed(p).into()); let mut output = Self::bare_call( origin, dest, @@ -715,6 +718,7 @@ pub mod pallet { gas_limit, DepositLimit::Balance(storage_deposit_limit), data, + payer_origin, ); if let Ok(return_value) = &output.result { @@ -891,7 +895,10 @@ pub mod pallet { gas_limit: Weight, #[pallet::compact] storage_deposit_limit: BalanceOf, data: Vec, + storage_deposit_payer: Option, ) -> DispatchResultWithPostInfo { + let payer_origin = storage_deposit_payer + .map(|p| frame_system::RawOrigin::Signed(p).into()); let mut output = Self::bare_call( origin, dest, @@ -899,6 +906,7 @@ pub mod pallet { gas_limit, DepositLimit::Balance(storage_deposit_limit), data, + payer_origin, ); if let Ok(return_value) = &output.result { @@ -1068,12 +1076,19 @@ where gas_limit: Weight, storage_deposit_limit: DepositLimit>, data: Vec, + storage_deposit_payer: Option>, ) -> ContractResult> { let mut gas_meter = GasMeter::new(gas_limit); let mut storage_deposit = Default::default(); let try_call = || { let origin = Origin::from_runtime_origin(origin)?; + let payer_origin = if let Some(payer) = storage_deposit_payer { + Origin::from_runtime_origin(payer)? + } else { + origin.clone() + }; + let mut storage_meter = StorageMeter::new(storage_deposit_limit.limit()); let result = ExecStack::>::run_call( origin.clone(), @@ -1085,7 +1100,7 @@ where storage_deposit_limit.is_unchecked(), )?; storage_deposit = storage_meter - .try_into_deposit(&origin, storage_deposit_limit.is_unchecked()) + .try_into_deposit(&payer_origin, storage_deposit_limit.is_unchecked()) .inspect_err(|err| { log::debug!(target: LOG_TARGET, "Failed to transfer deposit: {err:?}"); })?; @@ -1292,6 +1307,7 @@ where gas_limit, storage_deposit_limit, input.clone(), + None ); let data = match result.result { @@ -1324,6 +1340,7 @@ where gas_limit, storage_deposit_limit, data: input.clone(), + storage_deposit_payer: None } .into(); (result, dispatch_call) @@ -1838,6 +1855,7 @@ macro_rules! impl_runtime_apis_plus_revive { gas_limit: Option<$crate::Weight>, storage_deposit_limit: Option, input_data: Vec, + storage_deposit_payer: Option, ) -> $crate::ContractResult<$crate::ExecReturnValue, Balance> { use $crate::frame_support::traits::Get; let blockweights: $crate::BlockWeights = @@ -1851,6 +1869,7 @@ macro_rules! impl_runtime_apis_plus_revive { gas_limit.unwrap_or(blockweights.max_block), $crate::DepositLimit::Balance(storage_deposit_limit.unwrap_or(u128::MAX)), input_data, + storage_deposit_payer.map(|p| ::RuntimeOrigin::signed(p)), ) } diff --git a/substrate/frame/revive/src/test_utils/builder.rs b/substrate/frame/revive/src/test_utils/builder.rs index 2769484c68558..1f9d697d4ed01 100644 --- a/substrate/frame/revive/src/test_utils/builder.rs +++ b/substrate/frame/revive/src/test_utils/builder.rs @@ -185,6 +185,7 @@ builder!( gas_limit: Weight, storage_deposit_limit: BalanceOf, data: Vec, + storage_deposit_payer: Option, ) -> DispatchResultWithPostInfo; /// Create a [`CallBuilder`] with default values. @@ -196,6 +197,7 @@ builder!( gas_limit: GAS_LIMIT, storage_deposit_limit: deposit_limit::(), data: vec![], + storage_deposit_payer: None } } ); @@ -208,6 +210,7 @@ builder!( gas_limit: Weight, storage_deposit_limit: DepositLimit>, data: Vec, + storage_deposit_payer: Option>, ) -> ContractResult>; /// Set the call's evm_value using a native_value amount. @@ -230,6 +233,7 @@ builder!( gas_limit: GAS_LIMIT, storage_deposit_limit: DepositLimit::Balance(deposit_limit::()), data: vec![], + storage_deposit_payer: None } } ); @@ -242,6 +246,7 @@ builder!( gas_limit: Weight, storage_deposit_limit: BalanceOf, data: Vec, + storage_deposit_payer: Option, ) -> DispatchResultWithPostInfo; /// Create a [`EthCallBuilder`] with default values. @@ -253,6 +258,7 @@ builder!( gas_limit: GAS_LIMIT, storage_deposit_limit: deposit_limit::(), data: vec![], + storage_deposit_payer: None, } } ); diff --git a/substrate/frame/revive/src/tests/pvm.rs b/substrate/frame/revive/src/tests/pvm.rs index 81aab74f72f2f..826ece24059ca 100644 --- a/substrate/frame/revive/src/tests/pvm.rs +++ b/substrate/frame/revive/src/tests/pvm.rs @@ -1815,6 +1815,7 @@ fn call_runtime_reentrancy_guarded() { gas_limit: GAS_LIMIT / 3, storage_deposit_limit: deposit_limit::(), data: vec![], + storage_deposit_payer: None }) .encode();