diff --git a/src/connector.rs b/src/connector.rs index b50328780..444abd508 100644 --- a/src/connector.rs +++ b/src/connector.rs @@ -13,6 +13,7 @@ use crate::prelude::*; use crate::storage::{self, EthConnectorStorageId, KeyPrefix}; use borsh::{BorshDeserialize, BorshSerialize}; +pub(crate) const ERC20_ADMIN_PREFIX: &str = "erc20."; pub(crate) const ERR_NOT_ENOUGH_BALANCE_FOR_FEE: &str = "ERR_NOT_ENOUGH_BALANCE_FOR_FEE"; pub const NO_DEPOSIT: Balance = 0; const GAS_FOR_FINISH_DEPOSIT: Gas = 50_000_000_000_000; @@ -632,6 +633,11 @@ impl EthConnectorContract { } } +pub(crate) fn erc20_admin_address(base_account_id: &[u8]) -> Address { + let erc20_admin_account_id = [ERC20_ADMIN_PREFIX.as_bytes(), base_account_id].concat(); + crate::types::near_account_to_evm_address(erc20_admin_account_id.as_slice()) +} + impl AdminControlled for EthConnectorContract { fn get_paused(&self) -> PausedMask { self.paused_mask diff --git a/src/engine.rs b/src/engine.rs index 58cc7bb83..dd3dae0bb 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -5,9 +5,7 @@ use evm::executor::{StackExecutor, StackSubstateMetadata}; use evm::ExitFatal; use evm::{Config, CreateScheme, ExitError, ExitReason}; -use crate::connector::EthConnectorContract; -#[cfg(feature = "contract")] -use crate::contract::current_address; +use crate::connector::{self, EthConnectorContract}; use crate::map::{BijectionMap, LookupMap}; use crate::parameters::{ FunctionCallArgs, NEP141FtOnTransferArgs, NewCallArgs, PromiseCreateArgs, SubmitResult, @@ -15,7 +13,7 @@ use crate::parameters::{ }; use crate::precompiles::Precompiles; -use crate::prelude::{is_valid_account_id, Address, TryInto, Vec, H256, U256}; +use crate::prelude::{is_valid_account_id, Address, Cow, String, TryInto, Vec, H256, U256}; use crate::sdk; use crate::state::AuroraStackState; use crate::storage::{address_to_key, bytes_to_key, storage_to_key, KeyPrefix, KeyPrefixU8}; @@ -790,15 +788,49 @@ impl Engine { ethabi::Token::Uint(args.amount.into()), ]); + let erc20_admin_address = connector::erc20_admin_address(&sdk::current_account_id()); unwrap_res_or_finish!( self.call( - current_address(), + erc20_admin_address, erc20_token, Wei::zero(), [selector, tail.as_slice()].concat(), u64::MAX, Vec::new(), // TODO: are there values we should put here? - ), + ) + .and_then(|submit_result| { + match submit_result.status { + TransactionStatus::Succeed(_) => Ok(()), + TransactionStatus::Revert(bytes) => { + let error_message = crate::prelude::format!( + "Reverted with message: {}", + String::from_utf8_lossy(&bytes) + ); + Err(EngineError { + kind: EngineErrorKind::EvmError(ExitError::Other(Cow::from( + error_message, + ))), + gas_used: submit_result.gas_used, + }) + } + TransactionStatus::OutOfFund => Err(EngineError { + kind: EngineErrorKind::EvmError(ExitError::OutOfFund), + gas_used: submit_result.gas_used, + }), + TransactionStatus::OutOfOffset => Err(EngineError { + kind: EngineErrorKind::EvmError(ExitError::OutOfOffset), + gas_used: submit_result.gas_used, + }), + TransactionStatus::OutOfGas => Err(EngineError { + kind: EngineErrorKind::EvmError(ExitError::OutOfGas), + gas_used: submit_result.gas_used, + }), + TransactionStatus::CallTooDeep => Err(EngineError { + kind: EngineErrorKind::EvmError(ExitError::CallTooDeep), + gas_used: submit_result.gas_used, + }), + } + }), output_on_fail ); diff --git a/src/lib.rs b/src/lib.rs index 3650e1dc1..ddbe87646 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -76,7 +76,7 @@ pub unsafe fn on_alloc_error(_: core::alloc::Layout) -> ! { mod contract { use borsh::{BorshDeserialize, BorshSerialize}; - use crate::connector::EthConnectorContract; + use crate::connector::{self, EthConnectorContract}; use crate::engine::{Engine, EngineState, GasPaymentError}; use crate::fungible_token::FungibleTokenMetadata; #[cfg(feature = "evm_bully")] @@ -383,12 +383,13 @@ mod contract { let mut engine = Engine::new(predecessor_address()).sdk_unwrap(); + let erc20_admin_address = connector::erc20_admin_address(&sdk::current_account_id()); let erc20_contract = include_bytes!("../etc/eth-contracts/res/EvmErc20.bin"); let deploy_args = ethabi::encode(&[ ethabi::Token::String("Empty".to_string()), ethabi::Token::String("EMPTY".to_string()), ethabi::Token::Uint(ethabi::Uint::from(0)), - ethabi::Token::Address(current_address()), + ethabi::Token::Address(erc20_admin_address), ]); let address = match Engine::deploy_code_with_input( @@ -695,10 +696,6 @@ mod contract { fn predecessor_address() -> Address { near_account_to_evm_address(&sdk::predecessor_account_id()) } - - pub fn current_address() -> Address { - near_account_to_evm_address(&sdk::current_account_id()) - } } pub trait AuroraState { diff --git a/src/test_utils/mod.rs b/src/test_utils/mod.rs index 0b687f0af..b77a40e6b 100644 --- a/src/test_utils/mod.rs +++ b/src/test_utils/mod.rs @@ -30,6 +30,10 @@ pub fn origin() -> AccountId { "aurora".to_string() } +pub fn erc20_admin_account() -> AccountId { + [crate::connector::ERC20_ADMIN_PREFIX, &origin()].concat() +} + pub(crate) const SUBMIT: &str = "submit"; pub(crate) mod erc20; diff --git a/src/tests/contract_call.rs b/src/tests/contract_call.rs index 531da120f..f89137d27 100644 --- a/src/tests/contract_call.rs +++ b/src/tests/contract_call.rs @@ -1,4 +1,4 @@ -use crate::test_utils::{origin, AuroraRunner, Signer}; +use crate::test_utils::{AuroraRunner, Signer}; use crate::test_utils; use crate::test_utils::exit_precompile::{Tester, TesterConstructor}; @@ -23,7 +23,7 @@ fn setup_test() -> (AuroraRunner, Signer, [u8; 20], Tester) { token, tester.contract.address.into(), 1_000_000_000, - origin(), + test_utils::erc20_admin_account(), ); (runner, signer, token, tester) diff --git a/src/tests/erc20_connector.rs b/src/tests/erc20_connector.rs index 79d839388..5bc083efb 100644 --- a/src/tests/erc20_connector.rs +++ b/src/tests/erc20_connector.rs @@ -245,7 +245,7 @@ fn test_mint() { let balance = runner.balance_of(token, address, origin()); assert_eq!(balance, U256::from(0)); let amount = 10; - let _result = runner.mint(token, address, amount, origin()); + let _result = runner.mint(token, address, amount, test_utils::erc20_admin_account()); let balance = runner.balance_of(token, address, origin()); assert_eq!(balance, U256::from(amount)); } @@ -361,7 +361,12 @@ fn test_transfer_erc20_token() { U256::zero() ); - runner.mint(token, peer0.address, to_mint, origin()); + runner.mint( + token, + peer0.address, + to_mint, + test_utils::erc20_admin_account(), + ); assert_eq!( runner.balance_of(token, peer0.address, origin()),