git.delta.rocks / unique-network / refs/commits / d191478d543b

difftreelog

refactor move evm sponsoring effects to validity

Yaroslav Bolyukin2022-05-04parent: #1f6cb5b.patch.diff
in: master

5 files changed

modifiedpallets/evm-transaction-payment/src/lib.rsdiffbeforeafterboth
20use fp_evm::WithdrawReason;20use fp_evm::WithdrawReason;
21use frame_support::traits::{Currency, IsSubType};21use frame_support::traits::{Currency, IsSubType};
22pub use pallet::*;22pub use pallet::*;
23use pallet_evm::{EVMCurrencyAdapter, EnsureAddressOrigin, account::CrossAccountId};23use pallet_evm::{EnsureAddressOrigin, account::CrossAccountId};
24use sp_core::{H160, U256};24use sp_core::H160;
25use sp_runtime::{TransactionOutcome, DispatchError};25use sp_runtime::{TransactionOutcome, DispatchError};
26use up_sponsorship::SponsorshipHandler;26use up_sponsorship::SponsorshipHandler;
2727
43 pub struct Pallet<T>(_);43 pub struct Pallet<T>(_);
44}44}
45
46type NegativeImbalanceOf<C, T> =
47 <C as Currency<<T as frame_system::Config>::AccountId>>::NegativeImbalance;
48
49pub struct ChargeEvmLiquidityInfo<T>
50where
51 T: Config,
52 T: pallet_evm::Config,
53{
54 who: H160,
55 negative_imbalance: NegativeImbalanceOf<<T as Config>::Currency, T>,
56}
5745
58pub struct TransactionValidityHack<T: Config>(PhantomData<*const T>);46pub struct TransactionValidityHack<T: Config>(PhantomData<*const T>);
59impl<T: Config> fp_evm::TransactionValidityHack<T::CrossAccountId> for TransactionValidityHack<T> {47impl<T: Config> fp_evm::TransactionValidityHack<T::CrossAccountId> for TransactionValidityHack<T> {
60 fn who_pays_fee(origin: H160, reason: &WithdrawReason) -> Option<T::CrossAccountId> {48 fn who_pays_fee(origin: H160, reason: &WithdrawReason) -> Option<T::CrossAccountId> {
61 match reason {49 match reason {
62 WithdrawReason::Call { target, input } => {50 WithdrawReason::Call { target, input } => {
63 // This method is only used for checking, we shouldn't touch storage in it
64 frame_support::storage::with_transaction(|| {
65 let origin_sub = T::CrossAccountId::from_eth(origin);51 let origin_sub = T::CrossAccountId::from_eth(origin);
66 TransactionOutcome::Rollback(Ok::<_, DispatchError>(
67 T::EvmSponsorshipHandler::get_sponsor(52 T::EvmSponsorshipHandler::get_sponsor(&origin_sub, &(*target, input.clone()))
68 &origin_sub,
69 &(*target, input.clone()),
70 ),
71 ))
72 })
73 // FIXME: it may fail with DispatchError in case of depth limit
74 .ok()?
75 }53 }
76 _ => None,54 _ => None,
77 }55 }
78 }56 }
79}57}
80pub struct OnChargeTransaction<T: Config>(PhantomData<*const T>);
81impl<T> pallet_evm::OnChargeEVMTransaction<T> for OnChargeTransaction<T>
82where
83 T: Config,
84 T: pallet_evm::Config,
85{
86 type LiquidityInfo = Option<ChargeEvmLiquidityInfo<T>>;
87
88 fn withdraw_fee(
89 who: &T::CrossAccountId,
90 reason: WithdrawReason,
91 fee: U256,
92 ) -> core::result::Result<Self::LiquidityInfo, pallet_evm::Error<T>> {
93 let who_pays_fee = if let WithdrawReason::Call { target, input } = &reason {
94 T::EvmSponsorshipHandler::get_sponsor(who, &(*target, input.clone()))
95 .unwrap_or(who.clone())
96 } else {
97 who.clone()
98 };
99
100 let negative_imbalance = EVMCurrencyAdapter::<<T as Config>::Currency, ()>::withdraw_fee(
101 &who_pays_fee,
102 reason,
103 fee,
104 )?;
105
106 Ok(negative_imbalance.map(|i| ChargeEvmLiquidityInfo {
107 who: who_pays_fee.as_eth().clone(),
108 negative_imbalance: i,
109 }))
110 }
111
112 fn correct_and_deposit_fee(
113 who: &T::CrossAccountId,
114 corrected_fee: U256,
115 already_withdrawn: Self::LiquidityInfo,
116 ) {
117 <EVMCurrencyAdapter<<T as Config>::Currency, ()> as pallet_evm::OnChargeEVMTransaction<T>>::correct_and_deposit_fee(
118 &already_withdrawn.as_ref().map(|e| T::CrossAccountId::from_eth(e.who)).unwrap_or(who.clone()),
119 corrected_fee,
120 already_withdrawn.map(|e| e.negative_imbalance),
121 )
122 }
123
124 fn pay_priority_fee(tip: U256) {
125 <EVMCurrencyAdapter<<T as Config>::Currency, ()> as pallet_evm::OnChargeEVMTransaction<T>>::pay_priority_fee(tip)
126 }
127}
12858
129/// Implements sponsoring for evm calls performed from pallet-evm (via api.tx.ethereum.transact/api.tx.evm.call)59/// Implements sponsoring for evm calls performed from pallet-evm (via api.tx.ethereum.transact/api.tx.evm.call)
130pub struct BridgeSponsorshipHandler<T>(PhantomData<T>);60pub struct BridgeSponsorshipHandler<T>(PhantomData<T>);
147 )77 )
148 .ok()?;78 .ok()?;
149 let who = T::CrossAccountId::from_sub(who.clone());79 let who = T::CrossAccountId::from_sub(who.clone());
150 // Effects from EvmSponsorshipHandler are applied in OnChargeEvmTransaction by pallet_evm::runner80 // Effects from EvmSponsorshipHandler are applied by pallet_evm::runner
151 // TODO: Should we implement simulation mode (test, but do not apply effects) in `up-sponsorship`?81 // TODO: Should we implement simulation mode (test, but do not apply effects) in `up-sponsorship`?
152 let sponsor = frame_support::storage::with_transaction(|| {82 let sponsor = frame_support::storage::with_transaction(|| {
153 TransactionOutcome::Rollback(Ok::<_, DispatchError>(83 TransactionOutcome::Rollback(Ok::<_, DispatchError>(
modifiedpallets/unique/src/eth/sponsoring.rsdiffbeforeafterboth
14// You should have received a copy of the GNU General Public License14// You should have received a copy of the GNU General Public License
15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
1616
17//! Implements EVM sponsoring logic via OnChargeEVMTransaction17//! Implements EVM sponsoring logic via TransactionValidityHack
1818
19use crate::{Config, sponsorship::*};19use crate::{Config, sponsorship::*};
20use evm_coder::{Call, abi::AbiReader};20use evm_coder::{Call, abi::AbiReader};
modifiedruntime/opal/src/lib.rsdiffbeforeafterboth
301 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;301 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;
302 type ChainId = ChainId;302 type ChainId = ChainId;
303 type Runner = pallet_evm::runner::stack::Runner<Self>;303 type Runner = pallet_evm::runner::stack::Runner<Self>;
304 type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;304 type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;
305 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;305 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;
306 type FindAuthor = EthereumFindAuthor<Aura>;306 type FindAuthor = EthereumFindAuthor<Aura>;
307}307}
modifiedruntime/quartz/src/lib.rsdiffbeforeafterboth
280 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;280 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;
281 type ChainId = ChainId;281 type ChainId = ChainId;
282 type Runner = pallet_evm::runner::stack::Runner<Self>;282 type Runner = pallet_evm::runner::stack::Runner<Self>;
283 type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;283 type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;
284 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;284 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;
285 type FindAuthor = EthereumFindAuthor<Aura>;285 type FindAuthor = EthereumFindAuthor<Aura>;
286}286}
modifiedruntime/unique/src/lib.rsdiffbeforeafterboth
279 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;279 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;
280 type ChainId = ChainId;280 type ChainId = ChainId;
281 type Runner = pallet_evm::runner::stack::Runner<Self>;281 type Runner = pallet_evm::runner::stack::Runner<Self>;
282 type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;282 type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;
283 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;283 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;
284 type FindAuthor = EthereumFindAuthor<Aura>;284 type FindAuthor = EthereumFindAuthor<Aura>;
285}285}