--- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ *store_key*.json /.idea/ +/.cargo/ tests/.vscode cumulus-parachain/ --- a/Cargo.lock +++ b/Cargo.lock @@ -6146,6 +6146,7 @@ "sp-core", "sp-runtime", "sp-std", + "up-evm-mapping", "up-sponsorship", ] --- a/pallets/common/src/account.rs +++ b/pallets/common/src/account.rs @@ -23,6 +23,7 @@ use pallet_evm::AddressMapping; use sp_std::vec::Vec; use sp_std::clone::Clone; + pub use up_evm_mapping::EvmBackwardsAddressMapping; pub trait CrossAccountId: --- a/pallets/evm-contract-helpers/Cargo.toml +++ b/pallets/evm-contract-helpers/Cargo.toml @@ -17,6 +17,7 @@ pallet-evm-coder-substrate = { default-features = false, path = '../../pallets/evm-coder-substrate' } pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.18" } up-sponsorship = { version = "0.1.0", default-features = false, git = "https://github.com/UniqueNetwork/pallet-sponsoring", branch = 'polkadot-v0.9.18' } +up-evm-mapping = { default-features = false, path = "../../primitives/evm-mapping" } log = "0.4.14" [dependencies.codec] --- a/pallets/evm-contract-helpers/src/eth.rs +++ b/pallets/evm-contract-helpers/src/eth.rs @@ -17,14 +17,17 @@ use core::marker::PhantomData; use evm_coder::{abi::AbiWriter, execution::Result, generate_stubgen, solidity_interface, types::*}; use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder}; -use pallet_evm::{ExitRevert, OnCreate, OnMethodCall, PrecompileResult, PrecompileFailure}; +use pallet_evm::{ + ExitRevert, OnCreate, OnMethodCall, PrecompileResult, PrecompileFailure, AddressMapping +}; use sp_core::H160; use crate::{ AllowlistEnabled, Config, Owner, Pallet, SponsorBasket, SponsoringRateLimit, SponsoringModeT, }; use frame_support::traits::Get; use up_sponsorship::SponsorshipHandler; -use sp_std::{convert::TryInto, vec::Vec}; +use up_evm_mapping::EvmBackwardsAddressMapping; +use sp_std::vec::Vec; struct ContractHelpers(SubstrateRecorder); impl WithRecorder for ContractHelpers { @@ -177,13 +180,15 @@ } pub struct HelpersContractSponsoring(PhantomData<*const T>); -impl SponsorshipHandler)> for HelpersContractSponsoring { - fn get_sponsor(who: &H160, call: &(H160, Vec)) -> Option { +impl SponsorshipHandler)> for HelpersContractSponsoring { + fn get_sponsor(who: &T::AccountId, call: &(H160, Vec)) -> Option { let mode = >::sponsoring_mode(call.0); if mode == SponsoringModeT::Disabled { return None; } - if mode == SponsoringModeT::Allowlisted && !>::allowed(call.0, *who) { + + let who = T::EvmBackwardsAddressMapping::from_account_id(who.clone()); + if mode == SponsoringModeT::Allowlisted && !>::allowed(call.0, who) { return None; } let block_number = >::block_number() as T::BlockNumber; @@ -199,7 +204,8 @@ >::insert(&call.0, who, block_number); - Some(call.0) + let sponsor = T::EvmAddressMapping::into_account_id(call.0); + Some(sponsor) } } --- a/pallets/evm-contract-helpers/src/lib.rs +++ b/pallets/evm-contract-helpers/src/lib.rs @@ -33,6 +33,8 @@ pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config { type ContractAddress: Get; type DefaultSponsoringRateLimit: Get; + type EvmAddressMapping: pallet_evm::AddressMapping; + type EvmBackwardsAddressMapping: up_evm_mapping::EvmBackwardsAddressMapping; } #[pallet::error] --- a/pallets/evm-transaction-payment/src/lib.rs +++ b/pallets/evm-transaction-payment/src/lib.rs @@ -36,7 +36,7 @@ #[pallet::config] pub trait Config: frame_system::Config { - type EvmSponsorshipHandler: SponsorshipHandler)>; + type EvmSponsorshipHandler: SponsorshipHandler)>; type Currency: Currency; type EvmBackwardsAddressMapping: EvmBackwardsAddressMapping; type EvmAddressMapping: AddressMapping; @@ -60,14 +60,15 @@ } pub struct TransactionValidityHack(PhantomData<*const T>); -impl fp_evm::TransactionValidityHack for TransactionValidityHack { - fn who_pays_fee(origin: H160, reason: &WithdrawReason) -> Option { +impl fp_evm::TransactionValidityHack for TransactionValidityHack { + fn who_pays_fee(origin: H160, reason: &WithdrawReason) -> Option { match reason { WithdrawReason::Call { target, input } => { // This method is only used for checking, we shouldn't touch storage in it frame_support::storage::with_transaction(|| { + let origin_sub = T::EvmAddressMapping::into_account_id(origin); TransactionOutcome::Rollback(T::EvmSponsorshipHandler::get_sponsor( - &origin, + &origin_sub, &(*target, input.clone()), )) }) @@ -85,33 +86,36 @@ type LiquidityInfo = Option>; fn withdraw_fee( - who: &H160, + who: &T::AccountId, reason: WithdrawReason, fee: U256, ) -> core::result::Result> { - let mut who_pays_fee = *who; + let mut who_pays_fee = who.clone(); if let WithdrawReason::Call { target, input } = &reason { who_pays_fee = T::EvmSponsorshipHandler::get_sponsor(who, &(*target, input.clone())) .unwrap_or(who_pays_fee); } + let negative_imbalance = EVMCurrencyAdapter::<::Currency, ()>::withdraw_fee( &who_pays_fee, reason, fee, )?; + + let who_pays_fee_eth = T::EvmBackwardsAddressMapping::from_account_id(who_pays_fee); Ok(negative_imbalance.map(|i| ChargeEvmLiquidityInfo { - who: who_pays_fee, + who: who_pays_fee_eth, negative_imbalance: i, })) } fn correct_and_deposit_fee( - who: &H160, + who: &T::AccountId, corrected_fee: U256, already_withdrawn: Self::LiquidityInfo, ) { ::Currency, ()> as pallet_evm::OnChargeEVMTransaction>::correct_and_deposit_fee( - &already_withdrawn.as_ref().map(|e| e.who).unwrap_or(*who), + &already_withdrawn.as_ref().map(|e| T::EvmAddressMapping::into_account_id(e.who)).unwrap_or(who.clone()), corrected_fee, already_withdrawn.map(|e| e.negative_imbalance), ) @@ -142,7 +146,6 @@ >::Signed(who.clone()).into(), ) .ok()?; - let who = T::EvmBackwardsAddressMapping::from_account_id(who.clone()); // Effects from EvmSponsorshipHandler are applied in OnChargeEvmTransaction by pallet_evm::runner // TODO: Should we implement simulation mode (test, but do not apply effects) in `up-sponsorship`? let sponsor = frame_support::storage::with_transaction(|| { @@ -151,7 +154,6 @@ &(*target, input.clone()), )) })?; - let sponsor = T::EvmAddressMapping::into_account_id(sponsor); Some(sponsor) } _ => None, --- a/pallets/unique/src/eth/sponsoring.rs +++ b/pallets/unique/src/eth/sponsoring.rs @@ -32,14 +32,12 @@ use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call}; pub struct UniqueEthSponsorshipHandler(PhantomData<*const T>); -impl SponsorshipHandler)> for UniqueEthSponsorshipHandler { - fn get_sponsor(who: &H160, call: &(H160, Vec)) -> Option { +impl SponsorshipHandler)> for UniqueEthSponsorshipHandler { + fn get_sponsor(who: &T::AccountId, call: &(H160, Vec)) -> Option { let collection_id = map_eth_to_id(&call.0)?; let collection = >::new(collection_id)?; let sponsor = collection.sponsorship.sponsor()?.clone(); - let sponsor = - ::EvmBackwardsAddressMapping::from_account_id(sponsor); - let who = T::CrossAccountId::from_eth(*who); + let who = T::CrossAccountId::from_sub(who.clone()); let (method_id, mut reader) = AbiReader::new_call(&call.1).ok()?; match &collection.mode { crate::CollectionMode::NFT => { --- a/runtime/opal/src/lib.rs +++ b/runtime/opal/src/lib.rs @@ -933,6 +933,8 @@ impl pallet_evm_contract_helpers::Config for Runtime { type ContractAddress = HelpersContractAddress; type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit; + type EvmAddressMapping = pallet_evm::HashedAddressMapping; + type EvmBackwardsAddressMapping = up_evm_mapping::MapBackwardsAddressTruncated; } construct_runtime!(