Skip to content

Commit

Permalink
Return FT tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mrLSD committed Mar 8, 2023
1 parent 4ece9e1 commit 532766c
Show file tree
Hide file tree
Showing 9 changed files with 5,907 additions and 12 deletions.
3,943 changes: 3,943 additions & 0 deletions Cargo.lock

Large diffs are not rendered by default.

1,793 changes: 1,793 additions & 0 deletions res/mock_evm/Cargo.lock

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion res/mock_evm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ crate-type = ["cdylib", "rlib"]
[dependencies]
aurora-workspace-types = { path = "../../workspace-types" }
hex = "0.4.3"
near-sdk = "4.0"
near-sdk = "4.1"
near-contract-standards = "4.1"
serde = { version = "1", features = ["derive"] }
getrandom = {version = "0.2", default-features = false, features = ["custom"]}

Expand Down
4 changes: 4 additions & 0 deletions res/mock_evm/rust-toolchain.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[toolchain]
channel = "1.64.0"
components = ["rustfmt", "clippy"]
targets = ["wasm32-unknown-unknown"]
17 changes: 15 additions & 2 deletions res/mock_evm/src/metadata.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use crate::{MockEvmContract, MockEvmContractExt};
use aurora_workspace_types::input::{IsUsedProofCallArgs, StorageBalance};
use aurora_workspace_types::{output::TransactionStatus, AccountId, Raw};
use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata;
use near_sdk::{borsh, near_bindgen};

use crate::{MockEvmContract, MockEvmContractExt};

#[near_bindgen]
impl MockEvmContract {
pub fn get_version(&self) -> String {
Expand Down Expand Up @@ -31,6 +31,19 @@ impl MockEvmContract {
0
}

#[result_serializer(borsh)]
pub fn ft_metadata(&self) -> FungibleTokenMetadata {
FungibleTokenMetadata {
spec: "ft-1.0.0".to_string(),
name: "Ether".to_string(),
symbol: "ETH".to_string(),
icon: Some("data:image/png;base64,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".to_string()),
reference: None,
reference_hash: None,
decimals: 18,
}
}

#[result_serializer(borsh)]
pub fn get_view(&self, #[serializer(borsh)] _input: Raw) -> TransactionStatus {
TransactionStatus::Succeed(vec![])
Expand Down
1 change: 1 addition & 0 deletions workspace/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ borsh = { version = "0.9", default-features = false }
ethabi = { version = "18", optional = true }
ethereum-types = { version = "0.14", default-features = false, features = ["serialize"] }
near-sdk = "4.0"
near-contract-standards = "4.1"
near-primitives = "0.15"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
74 changes: 71 additions & 3 deletions workspace/src/contract.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
use crate::operation::{
Call, CallDeployCode, CallDeployErc20, CallEvm, CallFtOnTransfer, CallRegisterRelayer,
CallSubmit, View, ViewResultDetails,
Call, CallDeployCode, CallDeployErc20, CallEvm, CallFtOnTransfer, CallFtTransfer,
CallFtTransferCall, CallRegisterRelayer, CallStorageDeposit, CallStorageUnregister,
CallStorageWithdraw, CallSubmit, View, ViewResultDetails,
};
#[cfg(feature = "deposit-withdraw")]
use crate::operation::{CallDeposit, CallWithdraw};
use crate::{EngineCallTransaction, Result};
use aurora_engine::parameters::ViewCallArgs;
use aurora_engine::parameters::{GetStorageAtArgs, StorageBalance, TransactionStatus};
use aurora_engine::parameters::{
GetStorageAtArgs, StorageBalance, StorageDepositCallArgs, StorageWithdrawCallArgs,
TransactionStatus, TransferCallArgs, TransferCallCallArgs,
};
use aurora_workspace_types::input::IsUsedProofCallArgs;
use aurora_workspace_types::input::ProofInput;
#[cfg(feature = "deposit-withdraw")]
Expand All @@ -16,6 +20,7 @@ use aurora_workspace_types::{AccountId, Address, Raw, H256, U256};
use borsh::BorshSerialize;
#[cfg(feature = "ethabi")]
use ethabi::{ParamType, Token};
use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata;
use near_sdk::json_types::U128;
use std::borrow::{Borrow, BorrowMut};
use std::marker::PhantomData;
Expand Down Expand Up @@ -246,6 +251,22 @@ impl<U: UserFunctions> EvmAccount<U> {
CallWithdraw(self.near_call(&Call::Withdraw).args_borsh(args))
}

pub fn ft_transfer<R: AsRef<str>, A: Into<U128>>(
&self,
receiver_id: R,
amount: A,
memo: Option<String>,
) -> CallFtTransfer<'_> {
let args = TransferCallArgs {
// TODO: impl error
receiver_id: aurora_engine_types::account_id::AccountId::new(receiver_id.as_ref())
.unwrap(),
amount: aurora_engine_types::types::NEP141Wei::new(amount.into().0),
memo,
};
CallFtTransfer(self.near_call(&Call::FtTransfer).args_json(args))
}

pub fn ft_on_transfer<A: Into<U128>, R: AsRef<str>>(
&self,
sender_id: R,
Expand All @@ -260,6 +281,49 @@ impl<U: UserFunctions> EvmAccount<U> {
CallFtOnTransfer(self.near_call(&Call::FtOnTransfer).args_json(args))
}

pub fn ft_transfer_call<R: AsRef<str>>(
&self,
receiver_id: R,
amount: u128,
memo: Option<String>,
message: String,
) -> CallFtTransferCall<'_> {
let args = TransferCallCallArgs {
receiver_id: aurora_engine_types::account_id::AccountId::new(receiver_id.as_ref())
.unwrap(),
amount: aurora_engine_types::types::NEP141Wei::new(amount),
memo,
msg: message,
};
CallFtTransferCall(self.near_call(&Call::FtTransferCall).args_json(args))
}

// TODO we are not NEP-145 compliant
pub fn storage_deposit<A: AsRef<str>>(
&self,
account_id: Option<A>,
registration_only: Option<bool>,
) -> CallStorageDeposit<'_> {
let args = StorageDepositCallArgs {
account_id: account_id
.map(|a| aurora_engine_types::account_id::AccountId::new(a.as_ref()).unwrap()),
registration_only,
};
CallStorageDeposit(self.near_call(&Call::StorageDeposit).args_json(args))
}

pub fn storage_unregister(&self, force: bool) -> CallStorageUnregister<'_> {
let val = serde_json::json!({ "force": force });
CallStorageUnregister(self.near_call(&Call::StorageUnregister).args_json(val))
}

pub fn storage_withdraw(&self, amount: Option<u128>) -> CallStorageWithdraw<'_> {
let args = StorageWithdrawCallArgs {
amount: amount.map(aurora_engine_types::types::Yocto::new),
};
CallStorageWithdraw(self.near_call(&Call::StorageWithdraw).args_json(args))
}

pub async fn version(&self) -> Result<ViewResultDetails<String>> {
ViewResultDetails::try_from(self.near_view(&View::Version, vec![]).await?)
}
Expand Down Expand Up @@ -384,6 +448,10 @@ impl<U: UserFunctions> EvmAccount<U> {
ViewResultDetails::try_from(self.near_view(&View::FtBalanceOf, args).await?)
}

pub async fn ft_metadata(&self) -> Result<ViewResultDetails<FungibleTokenMetadata>> {
ViewResultDetails::try_from(self.near_view(&View::FtMetadata, vec![]).await?)
}

pub async fn eth_balance_of<A: Into<Address>>(
&self,
address: A,
Expand Down
32 changes: 31 additions & 1 deletion workspace/src/operation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ use crate::Result;
#[cfg(feature = "deposit-withdraw")]
use aurora_engine::parameters::WithdrawResult;
use aurora_engine::parameters::{StorageBalance, TransactionStatus};
use aurora_engine_sdk::promise::PromiseId;
use aurora_engine_types::types::Wei;
use aurora_workspace_types::AccountId;
use borsh::BorshDeserialize;
#[cfg(feature = "ethabi")]
use ethabi::{ParamType, Token};
use ethereum_types::{Address, H256, U256};
use near_contract_standards::fungible_token::metadata::FungibleTokenMetadata;
use workspaces::operations::CallTransaction;
use workspaces::result::ExecutionFinalResult;

Expand Down Expand Up @@ -52,7 +54,12 @@ impl_call_return![
(CallEvm, ExecutionSuccess<SubmitResult>, try_from_borsh),
(CallSubmit, ExecutionSuccess<SubmitResult>, try_from_borsh),
(CallRegisterRelayer, ExecutionSuccess<()>, try_from),
(CallFtOnTransfer, ExecutionSuccess<String>, try_from_json)
(CallFtOnTransfer, ExecutionSuccess<String>, try_from_json),
(CallFtTransfer, ExecutionSuccess<()>, try_from),
(CallFtTransferCall, ExecutionSuccess<PromiseId>, try_from),
(CallStorageDeposit, ExecutionSuccess<()>, try_from),
(CallStorageUnregister, ExecutionSuccess<()>, try_from),
(CallStorageWithdraw, ExecutionSuccess<()>, try_from)
];

#[cfg(feature = "deposit-withdraw")]
Expand All @@ -75,6 +82,11 @@ pub(crate) enum Call {
FtOnTransfer,
Withdraw,
Deposit,
FtTransfer,
FtTransferCall,
StorageDeposit,
StorageUnregister,
StorageWithdraw,
}

impl AsRef<str> for Call {
Expand All @@ -89,6 +101,11 @@ impl AsRef<str> for Call {
FtOnTransfer => "ft_on_transfer",
Withdraw => "withdraw",
Deposit => "deposit",
FtTransfer => "ft_transfer",
FtTransferCall => "ft_transfer_call",
StorageDeposit => "storage_deposit",
StorageUnregister => "storage_unregister",
StorageWithdraw => "storage_withdraw",
}
}
}
Expand Down Expand Up @@ -255,6 +272,19 @@ impl ViewResultDetails<U256> {
}
}

impl TryFrom<workspaces::result::ViewResultDetails> for ViewResultDetails<FungibleTokenMetadata> {
type Error = Error;

fn try_from(view: workspaces::result::ViewResultDetails) -> Result<Self> {
let result: FungibleTokenMetadata =
FungibleTokenMetadata::try_from_slice(view.result.as_slice())?;
Ok(Self {
result,
logs: view.logs,
})
}
}

impl TryFrom<workspaces::result::ViewResultDetails> for ViewResultDetails<StorageBalance> {
type Error = Error;

Expand Down
52 changes: 47 additions & 5 deletions workspace/tests/ft_tests.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,57 @@
use aurora_workspace_types::AccountId;
use near_sdk::json_types::U128;
use std::str::FromStr;

mod common;

#[tokio::test]
async fn test_ft_on_transfer() {
let contract = common::init_and_deploy_contract().await.unwrap();
async fn test_ft_transfer() -> anyhow::Result<()> {
let contract = common::init_and_deploy_contract().await?;

contract
.as_account()
.ft_transfer("some_account.test", 10, Some("some message".to_string()))
.transact()
.await?;

Ok(())
}

#[tokio::test]
async fn test_ft_on_transfer() -> anyhow::Result<()> {
let contract = common::init_and_deploy_contract().await?;

let res = contract
.as_account()
.ft_on_transfer("some_account.test", 100, String::new())
.ft_on_transfer(
AccountId::from_str("some_account.test").expect("Failed to make Account from str"),
U128::from(100),
String::new(),
)
.transact()
.await
.unwrap()
.await?
.into_value();

assert_eq!(0u8.to_string(), res);

Ok(())
}

#[tokio::test]
async fn test_ft_transfer_call() -> anyhow::Result<()> {
let contract = common::init_and_deploy_contract().await?;

let res = contract
.as_account()
.ft_transfer_call(
"receiver.test",
10,
Some("some memo".to_string()),
"some message".to_string(),
)
.transact()
.await?
.into_value();

Ok(())
}

0 comments on commit 532766c

Please sign in to comment.