Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion substrate/frame/revive/src/evm/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,7 @@ pub trait EthExtra {
gas_limit,
storage_deposit_limit,
data,
storage_deposit_payer: None
}
.into()
}
Expand Down Expand Up @@ -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()
);
Expand Down
4 changes: 4 additions & 0 deletions substrate/frame/revive/src/impl_fungibles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ where
<<T as pallet::Config>::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) {
Expand Down Expand Up @@ -117,6 +118,7 @@ where
<<T as pallet::Config>::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) {
Expand Down Expand Up @@ -192,6 +194,7 @@ where
<<T as pallet::Config>::Currency as fungible::Inspect<_>>::total_issuance(),
),
data,
None
);
log::trace!(target: "whatiwant", "{gas_consumed}");
if let Ok(return_value) = result {
Expand Down Expand Up @@ -229,6 +232,7 @@ where
<<T as pallet::Config>::Currency as fungible::Inspect<_>>::total_issuance(),
),
data,
None
);
if let Ok(return_value) = result {
if return_value.did_revert() {
Expand Down
21 changes: 20 additions & 1 deletion substrate/frame/revive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -707,14 +707,18 @@ pub mod pallet {
gas_limit: Weight,
#[pallet::compact] storage_deposit_limit: BalanceOf<T>,
data: Vec<u8>,
storage_deposit_payer: Option<T::AccountId>,
) -> DispatchResultWithPostInfo {
let payer_origin = storage_deposit_payer
.map(|p| frame_system::RawOrigin::Signed(p).into());
let mut output = Self::bare_call(
origin,
dest,
Pallet::<T>::convert_native_to_evm(value),
gas_limit,
DepositLimit::Balance(storage_deposit_limit),
data,
payer_origin,
);

if let Ok(return_value) = &output.result {
Expand Down Expand Up @@ -891,14 +895,18 @@ pub mod pallet {
gas_limit: Weight,
#[pallet::compact] storage_deposit_limit: BalanceOf<T>,
data: Vec<u8>,
storage_deposit_payer: Option<T::AccountId>,
) -> DispatchResultWithPostInfo {
let payer_origin = storage_deposit_payer
.map(|p| frame_system::RawOrigin::Signed(p).into());
let mut output = Self::bare_call(
origin,
dest,
value,
gas_limit,
DepositLimit::Balance(storage_deposit_limit),
data,
payer_origin,
);

if let Ok(return_value) = &output.result {
Expand Down Expand Up @@ -1068,12 +1076,19 @@ where
gas_limit: Weight,
storage_deposit_limit: DepositLimit<BalanceOf<T>>,
data: Vec<u8>,
storage_deposit_payer: Option<OriginFor<T>>,
) -> ContractResult<ExecReturnValue, BalanceOf<T>> {
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::<T, ContractBlob<T>>::run_call(
origin.clone(),
Expand All @@ -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:?}");
})?;
Expand Down Expand Up @@ -1292,6 +1307,7 @@ where
gas_limit,
storage_deposit_limit,
input.clone(),
None
);

let data = match result.result {
Expand Down Expand Up @@ -1324,6 +1340,7 @@ where
gas_limit,
storage_deposit_limit,
data: input.clone(),
storage_deposit_payer: None
}
.into();
(result, dispatch_call)
Expand Down Expand Up @@ -1838,6 +1855,7 @@ macro_rules! impl_runtime_apis_plus_revive {
gas_limit: Option<$crate::Weight>,
storage_deposit_limit: Option<Balance>,
input_data: Vec<u8>,
storage_deposit_payer: Option<AccountId>,
) -> $crate::ContractResult<$crate::ExecReturnValue, Balance> {
use $crate::frame_support::traits::Get;
let blockweights: $crate::BlockWeights =
Expand All @@ -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| <Self as $crate::frame_system::Config>::RuntimeOrigin::signed(p)),
)
}

Expand Down
6 changes: 6 additions & 0 deletions substrate/frame/revive/src/test_utils/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ builder!(
gas_limit: Weight,
storage_deposit_limit: BalanceOf<T>,
data: Vec<u8>,
storage_deposit_payer: Option<T::AccountId>,
) -> DispatchResultWithPostInfo;

/// Create a [`CallBuilder`] with default values.
Expand All @@ -196,6 +197,7 @@ builder!(
gas_limit: GAS_LIMIT,
storage_deposit_limit: deposit_limit::<T>(),
data: vec![],
storage_deposit_payer: None
}
}
);
Expand All @@ -208,6 +210,7 @@ builder!(
gas_limit: Weight,
storage_deposit_limit: DepositLimit<BalanceOf<T>>,
data: Vec<u8>,
storage_deposit_payer: Option<OriginFor<T>>,
) -> ContractResult<ExecReturnValue, BalanceOf<T>>;

/// Set the call's evm_value using a native_value amount.
Expand All @@ -230,6 +233,7 @@ builder!(
gas_limit: GAS_LIMIT,
storage_deposit_limit: DepositLimit::Balance(deposit_limit::<T>()),
data: vec![],
storage_deposit_payer: None
}
}
);
Expand All @@ -242,6 +246,7 @@ builder!(
gas_limit: Weight,
storage_deposit_limit: BalanceOf<T>,
data: Vec<u8>,
storage_deposit_payer: Option<T::AccountId>,
) -> DispatchResultWithPostInfo;

/// Create a [`EthCallBuilder`] with default values.
Expand All @@ -253,6 +258,7 @@ builder!(
gas_limit: GAS_LIMIT,
storage_deposit_limit: deposit_limit::<T>(),
data: vec![],
storage_deposit_payer: None,
}
}
);
1 change: 1 addition & 0 deletions substrate/frame/revive/src/tests/pvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1815,6 +1815,7 @@ fn call_runtime_reentrancy_guarded() {
gas_limit: GAS_LIMIT / 3,
storage_deposit_limit: deposit_limit::<Test>(),
data: vec![],
storage_deposit_payer: None
})
.encode();

Expand Down
Loading