From ea39b21f5df767e4eb72c7ebdcb76750fce277ac Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Fri, 18 Mar 2022 13:47:15 +0000 Subject: [PATCH] Fix SponsorshipHandler --- --- a/pallets/evm-contract-helpers/src/eth.rs +++ b/pallets/evm-contract-helpers/src/eth.rs @@ -18,7 +18,7 @@ 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, AddressMapping + ExitRevert, OnCreate, OnMethodCall, PrecompileResult, PrecompileFailure, account::CrossAccountId }; use sp_core::H160; use crate::{ @@ -26,7 +26,6 @@ }; use frame_support::traits::Get; use up_sponsorship::SponsorshipHandler; -use up_evm_mapping::EvmBackwardsAddressMapping; use sp_std::vec::Vec; struct ContractHelpers(SubstrateRecorder); @@ -180,20 +179,19 @@ } pub struct HelpersContractSponsoring(PhantomData<*const T>); -impl SponsorshipHandler)> for HelpersContractSponsoring { - fn get_sponsor(who: &T::AccountId, call: &(H160, Vec)) -> Option { +impl SponsorshipHandler)> for HelpersContractSponsoring { + fn get_sponsor(who: &T::CrossAccountId, call: &(H160, Vec)) -> Option { let mode = >::sponsoring_mode(call.0); if mode == SponsoringModeT::Disabled { return None; } - let who = T::EvmBackwardsAddressMapping::from_account_id(who.clone()); - if mode == SponsoringModeT::Allowlisted && !>::allowed(call.0, who) { + if mode == SponsoringModeT::Allowlisted && !>::allowed(call.0, *who.as_eth()) { return None; } let block_number = >::block_number() as T::BlockNumber; - if let Some(last_tx_block) = >::get(&call.0, who) { + if let Some(last_tx_block) = >::get(&call.0, who.as_eth()) { let limit = >::get(&call.0); let timeout = last_tx_block + limit; @@ -202,9 +200,9 @@ } } - >::insert(&call.0, who, block_number); + >::insert(&call.0, who.as_eth(), block_number); - let sponsor = T::EvmAddressMapping::into_account_id(call.0); + let sponsor = T::CrossAccountId::from_eth(call.0); Some(sponsor) } } --- a/pallets/evm-contract-helpers/src/lib.rs +++ b/pallets/evm-contract-helpers/src/lib.rs @@ -30,11 +30,9 @@ use sp_core::H160; #[pallet::config] - pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config { + pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::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 @@ -24,8 +24,6 @@ use sp_core::{H160, U256}; use sp_runtime::TransactionOutcome; use up_sponsorship::SponsorshipHandler; -use up_evm_mapping::EvmBackwardsAddressMapping; -use pallet_evm::AddressMapping; #[frame_support::pallet] pub mod pallet { @@ -36,7 +34,7 @@ #[pallet::config] pub trait Config: frame_system::Config + pallet_evm::account::Config { - type EvmSponsorshipHandler: SponsorshipHandler)>; + type EvmSponsorshipHandler: SponsorshipHandler)>; type Currency: Currency; } @@ -58,13 +56,13 @@ } 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); + let origin_sub = T::CrossAccountId::from_eth(origin); TransactionOutcome::Rollback(T::EvmSponsorshipHandler::get_sponsor( &origin_sub, &(*target, input.clone()), @@ -88,13 +86,11 @@ reason: WithdrawReason, fee: U256, ) -> core::result::Result> { - let who_pays_fee; - if let WithdrawReason::Call { target, input } = &reason { - who_pays_fee = ::CrossAccountId::from_sub(T::EvmSponsorshipHandler::get_sponsor(&who.as_sub(), &(*target, input.clone())) - .unwrap_or(who.as_sub().clone())); + let who_pays_fee = if let WithdrawReason::Call { target, input } = &reason { + T::EvmSponsorshipHandler::get_sponsor(who, &(*target, input.clone())).unwrap_or(who.clone()) } else { - who_pays_fee = who.clone(); - } + who.clone() + }; let negative_imbalance = EVMCurrencyAdapter::<::Currency, ()>::withdraw_fee( &who_pays_fee, @@ -145,6 +141,7 @@ >::Signed(who.clone()).into(), ) .ok()?; + let who = T::CrossAccountId::from_sub(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(|| { @@ -153,7 +150,7 @@ &(*target, input.clone()), )) })?; - Some(sponsor) + Some(sponsor.as_sub().clone()) } _ => None, } --- a/pallets/unique/src/eth/sponsoring.rs +++ b/pallets/unique/src/eth/sponsoring.rs @@ -31,14 +31,13 @@ use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call}; pub struct UniqueEthSponsorshipHandler(PhantomData<*const T>); -impl SponsorshipHandler)> for UniqueEthSponsorshipHandler { - fn get_sponsor(who: &T::AccountId, call: &(H160, Vec)) -> Option { +impl SponsorshipHandler)> for UniqueEthSponsorshipHandler { + fn get_sponsor(who: &T::CrossAccountId, 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 who = T::CrossAccountId::from_sub(who.clone()); let (method_id, mut reader) = AbiReader::new_call(&call.1).ok()?; - match &collection.mode { + Some(T::CrossAccountId::from_sub(match &collection.mode { crate::CollectionMode::NFT => { let call = >::parse(method_id, &mut reader).ok()??; match call { @@ -66,7 +65,7 @@ #[allow(clippy::single_match)] match call { UniqueFungibleCall::ERC20(ERC20Call::Transfer { .. }) => { - withdraw_transfer::(&collection, &who, &TokenId::default()) + withdraw_transfer::(&collection, who, &TokenId::default()) .map(|()| sponsor) } UniqueFungibleCall::ERC20(ERC20Call::TransferFrom { from, .. }) => { @@ -82,6 +81,6 @@ } } _ => None, - } + }?)) } } --- a/pallets/unique/src/tests.rs +++ b/pallets/unique/src/tests.rs @@ -2866,8 +2866,7 @@ let origin2 = Origin::signed(user2); let account2 = account(user2); - let collection_id = - create_test_collection_for_owner(&CollectionMode::NFT, user1, CollectionId(1)); + let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, user1, CollectionId(1)); assert_ok!(TemplateModule::set_collection_sponsor(origin1.clone(), collection_id, user1)); assert_ok!(TemplateModule::confirm_sponsorship(origin1.clone(), collection_id)); @@ -2877,12 +2876,7 @@ assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), collection_id, AccessMode::AllowList)); assert_ok!(TemplateModule::add_to_allow_list(origin1.clone(), collection_id, account2.clone())); assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), collection_id, true)); - - assert_eq!(>::free_balance(user2), 0); - let balance_before = >::free_balance(user1); assert_ok!(TemplateModule::create_item(origin2, collection_id, account2, default_nft_data().into())); - let balance_after = >::free_balance(user1); - assert_ne!(balance_before, balance_after); }); } \ No newline at end of file --- a/runtime/opal/src/lib.rs +++ b/runtime/opal/src/lib.rs @@ -948,8 +948,6 @@ 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!( --- a/tests/README.md +++ b/tests/README.md @@ -20,7 +20,7 @@ git clone https://github.com/paritytech/polkadot-launch && cd polkadot-launch ``` -5. Run launch-test-env.sh from the root of this project +5. Run launch-testnet.sh from the root of this project ## How to run tests --- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -288,14 +288,15 @@ const result = getCreateCollectionResult(events); expect(result.success).to.be.true; } + { const nextTokenId = await contract.methods.nextTokenId().call(); expect(nextTokenId).to.be.equal('1'); - // const result = await contract.methods.mintWithTokenURI( - // receiver, - // nextTokenId, - // 'Test URI', - // ).send({from: userEth}); + const result = await contract.methods.mintWithTokenURI( + receiver, + nextTokenId, + 'Test URI', + ).send({from: userEth}); // const events = normalizeEvents(result.events); // expect(events).to.be.deep.equal([ -- gitstuff