From cc5ec7758f4400f7541b38f022d4283fc0ef906f Mon Sep 17 00:00:00 2001 From: Septen Date: Thu, 3 Jun 2021 03:30:23 +0300 Subject: [PATCH 1/4] EthConnector: add `is_used_proof()` method. --- src/connector.rs | 8 ++++++-- src/lib.rs | 13 +++++++++++-- src/parameters.rs | 8 ++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/connector.rs b/src/connector.rs index fd4df0110..6db5a125a 100644 --- a/src/connector.rs +++ b/src/connector.rs @@ -8,7 +8,7 @@ use crate::deposit_event::*; use crate::engine::Engine; use crate::json::parse_json; use crate::prelude::*; -use crate::prover::validate_eth_address; +use crate::prover::{validate_eth_address, Proof}; use crate::storage::{self, EthConnectorStorageId, KeyPrefix}; #[cfg(feature = "log")] use alloc::format; @@ -181,7 +181,6 @@ impl EthConnectorContract { pub fn deposit(&self) { self.assert_not_paused(PAUSE_DEPOSIT); - use crate::prover::Proof; #[cfg(feature = "log")] sdk::log("[Deposit tokens]"); @@ -643,6 +642,11 @@ impl EthConnectorContract { sdk::storage_has_key(&self.used_event_key(key)) } + /// Checks whether the provided proof was already used + pub fn is_used_proof(&self, proof: Proof) -> bool { + self.check_used_event(&proof.get_key()) + } + /// Get Eth connector paused flags pub fn get_paused_flags(&self) -> PausedMask { self.get_paused() diff --git a/src/lib.rs b/src/lib.rs index eb4cb5364..eb8441957 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -86,8 +86,9 @@ mod contract { #[cfg(feature = "evm_bully")] use crate::parameters::{BeginBlockArgs, BeginChainArgs}; use crate::parameters::{ - ExpectUtf8, FunctionCallArgs, GetStorageAtArgs, InitCallArgs, NewCallArgs, - PauseEthConnectorCallArgs, SetContractDataCallArgs, TransferCallCallArgs, ViewCallArgs, + ExpectUtf8, FunctionCallArgs, GetStorageAtArgs, InitCallArgs, IsUsedProofCallArgs, + NewCallArgs, PauseEthConnectorCallArgs, SetContractDataCallArgs, TransferCallCallArgs, + ViewCallArgs, }; use crate::prelude::{Address, H256, U256}; use crate::sdk; @@ -401,6 +402,14 @@ mod contract { EthConnectorContract::get_instance().finish_deposit_near(); } + #[no_mangle] + pub extern "C" fn is_used_proof() { + let args = IsUsedProofCallArgs::try_from_slice(&sdk::read_input()).expect(ERR_FAILED_PARSE); + + let is_used_proof = EthConnectorContract::get_instance().is_used_proof(args.proof); + sdk::return_output(&is_used_proof.try_to_vec().unwrap()); + } + #[no_mangle] pub extern "C" fn ft_total_supply() { EthConnectorContract::get_instance().ft_total_supply(); diff --git a/src/parameters.rs b/src/parameters.rs index 7b1831427..fc2d4c5f9 100644 --- a/src/parameters.rs +++ b/src/parameters.rs @@ -145,6 +145,14 @@ pub struct DepositCallArgs { pub relayer_eth_account: Option, } +/// Eth-connector isUsedProof arguments +#[cfg(feature = "engine")] +#[derive(BorshSerialize, BorshDeserialize)] +pub struct IsUsedProofCallArgs { + /// Proof data + pub proof: Proof, +} + /// withdraw result for eth-connector #[cfg(feature = "engine")] #[derive(BorshSerialize)] From 9df54417393ac6717ce0dbd15719f31fbbe33bbd Mon Sep 17 00:00:00 2001 From: Septen Date: Thu, 3 Jun 2021 03:31:29 +0300 Subject: [PATCH 2/4] EthConnector: add `is_used_proof() ` tests. --- src/lib.rs | 3 +- tests/test_connector.rs | 113 ++++++++++++++++++++++++++++++++-------- 2 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index eb8441957..ca8d4eeed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -407,7 +407,8 @@ mod contract { let args = IsUsedProofCallArgs::try_from_slice(&sdk::read_input()).expect(ERR_FAILED_PARSE); let is_used_proof = EthConnectorContract::get_instance().is_used_proof(args.proof); - sdk::return_output(&is_used_proof.try_to_vec().unwrap()); + let res = is_used_proof.try_to_vec().unwrap(); + sdk::return_output(&res[..]); } #[no_mangle] diff --git a/tests/test_connector.rs b/tests/test_connector.rs index d0e4bda26..fb17e8229 100644 --- a/tests/test_connector.rs +++ b/tests/test_connector.rs @@ -33,6 +33,10 @@ const DEPOSITED_EVM_AMOUNT: u128 = 10200; const DEPOSITED_EVM_FEE: u128 = 200; const ERR_NOT_ENOUGH_BALANCE_FOR_FEE: &'static str = "ERR_NOT_ENOUGH_BALANCE_FOR_FEE"; const ERR_PAUSED: &'static str = "ERR_PAUSED"; +const ERR_PROOF_USED: &'static str = + "Expected not to fail and to have an unused proof but it was already used"; +const ERR_PROOF_NOT_USED: &'static str = + "Expected not to fail because the proof should have been already used"; near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { EVM_WASM_BYTES => "release.wasm" @@ -68,6 +72,11 @@ pub struct WithdrawResult { pub eth_custodian_address: EthAddress, } +#[derive(BorshDeserialize, Debug)] +pub struct IsUsedProofResult { + pub is_used_proof: bool, +} + fn init(custodian_address: &str) -> (UserAccount, UserAccount) { let master_account = near_sdk_sim::init_simulator(None); let contract = init_contract(&master_account, CONTRACT_ACC, custodian_address); @@ -144,6 +153,29 @@ fn call_deposit_near(master_account: &UserAccount, contract: &str) -> Vec