Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add missing self call methods #6

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions res/mock_evm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,26 @@ impl MockEvmContract {
pub fn register_relayer(&mut self, #[serializer(borsh)] input: Raw) {
assert_eq!(input.0.len(), 20);
}

//
// SELF CALL METHODS
//

pub fn set_eth_connector_contract_data(&mut self, #[serializer(borsh)] _input: Raw) {}

pub fn set_paused_flags(&mut self, #[serializer(borsh)] _input: Raw) {}

//
// CALLBACK HANDLER METHODS
//

#[result_serializer(borsh)]
pub fn factory_update_address_version(&mut self, #[serializer(borsh)] _input: Raw) -> u8 {
0
}

#[result_serializer(borsh)]
pub fn refund_on_error(&mut self, #[serializer(borsh)] _input: Raw) -> u8 {
0
}
}
78 changes: 70 additions & 8 deletions workspace/src/contract.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
use crate::operation::{
Call, CallDeployCode, CallDeployErc20, CallEvm, CallFtOnTransfer, CallFtTransfer,
CallFtTransferCall, CallRegisterRelayer, CallStorageDeposit, CallStorageUnregister,
CallStorageWithdraw, CallSubmit, View, ViewResultDetails,
Call, CallDeployCode, CallDeployErc20, CallEvm, CallFactoryUpdateAddressVersion,
CallFtOnTransfer, CallFtTransfer, CallFtTransferCall, CallRefundOnError, CallRegisterRelayer,
CallSetEthConnectorContractData, CallSetPausedFlags, CallStorageDeposit, CallStorageUnregister,
CallStorageWithdraw, CallSubmit, SelfCall, 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, StorageDepositCallArgs, StorageWithdrawCallArgs,
TransactionStatus, TransferCallArgs,
use aurora_engine::fungible_token::FungibleTokenMetadata;
use aurora_engine::{
parameters::{
GetStorageAtArgs, PauseEthConnectorCallArgs, SetContractDataCallArgs, StorageBalance,
StorageDepositCallArgs, StorageWithdrawCallArgs, TransactionStatus, TransferCallArgs,
ViewCallArgs,
},
xcc::AddressVersionUpdateArgs,
};
use aurora_workspace_types::input::IsUsedProofCallArgs;
use aurora_workspace_types::input::ProofInput;
Expand All @@ -20,7 +25,6 @@ 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 serde_json::json;
use std::borrow::{Borrow, BorrowMut};
Expand Down Expand Up @@ -190,6 +194,64 @@ impl<U: UserFunctions> EvmAccount<U> {
self.account.id()
}

pub fn set_eth_connector_contract_data(
&self,
prover_account: impl AsRef<str>,
eth_custodian_address: impl Into<String>,
metadata: FungibleTokenMetadata,
) -> CallSetEthConnectorContractData<'_> {
let args = SetContractDataCallArgs {
prover_account: aurora_engine_types::account_id::AccountId::new(
prover_account.as_ref(),
)
.unwrap(),
eth_custodian_address: eth_custodian_address.into(),
metadata,
};
CallSetEthConnectorContractData(
self.near_call(&SelfCall::SetEthConnectorContractData)
.args_borsh(args),
)
}

pub fn set_paused_flags(&self, paused_mask: u8) -> CallSetPausedFlags<'_> {
let args = PauseEthConnectorCallArgs { paused_mask };
CallSetPausedFlags(self.near_call(&SelfCall::SetPausedFlags).args_borsh(args))
}

pub fn factory_update_address_version(
&self,
address: impl Into<Address>,
version: u32,
) -> CallFactoryUpdateAddressVersion<'_> {
let args = AddressVersionUpdateArgs {
address: aurora_engine_types::types::Address::new(address.into()),
version: aurora_engine::xcc::CodeVersion(version),
};
CallFactoryUpdateAddressVersion(
self.near_call(&SelfCall::FactoryUpdateAddressVersion)
.args_borsh(args),
)
}

pub fn refund_on_error<A: Into<Address>>(
&self,
recipient_address: A,
erc20_address: Option<A>,
amount: U256,
) -> CallRefundOnError<'_> {
let mut raw_amount: aurora_engine_types::types::RawU256 = Default::default();
amount.to_big_endian(&mut raw_amount);
let args = aurora_engine_types::parameters::RefundCallArgs {
recipient_address: aurora_engine_types::types::Address::new(recipient_address.into()),
erc20_address: erc20_address
.map(Into::into)
.map(aurora_engine_types::types::Address::new),
amount: raw_amount,
};
CallRefundOnError(self.near_call(&SelfCall::RefundOnError).args_borsh(args))
}

/// Deploys contract code using the caller's NEAR account ID as an Ethereum address.
///
/// The logic which creates the ETH address is as follows:
Expand Down
34 changes: 21 additions & 13 deletions workspace/src/operation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,25 @@ use crate::error::Error;
use crate::result::ExecutionSuccess;
use crate::types::output::SubmitResult;
use crate::Result;
use aurora_engine::fungible_token::FungibleTokenMetadata;
#[cfg(feature = "deposit-withdraw")]
use aurora_engine::parameters::WithdrawResult;
use aurora_engine::parameters::{StorageBalance, TransactionStatus};
#[cfg(feature = "deposit-withdraw")]
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 near_sdk::json_types::U128;
use near_sdk::PromiseOrValue;
use workspaces::operations::CallTransaction;
use workspaces::result::ExecutionFinalResult;

macro_rules! impl_call_return {
($(($name:ident, $return:ty, $fun:ident)),*) => {
($(($name:ident, $return:ty, $deser_fn:ident)),* $(,)?) => {
$(pub struct $name<'a>(pub(crate) EngineCallTransaction<'a>);

impl<'a> $name<'a> {
Expand All @@ -39,7 +41,7 @@ macro_rules! impl_call_return {
}

pub async fn transact(self) -> Result<$return> {
ExecutionSuccess::$fun(self.0.transact().await?)
ExecutionSuccess::$deser_fn(self.0.transact().await?)
}
})*
}
Expand All @@ -64,7 +66,19 @@ impl_call_return![
),
(CallStorageDeposit, ExecutionSuccess<()>, try_from),
(CallStorageUnregister, ExecutionSuccess<()>, try_from),
(CallStorageWithdraw, ExecutionSuccess<()>, try_from)
(CallStorageWithdraw, ExecutionSuccess<()>, try_from),
(
CallSetEthConnectorContractData,
ExecutionSuccess<()>,
try_from_borsh
),
(CallSetPausedFlags, ExecutionSuccess<()>, try_from_borsh),
(
CallFactoryUpdateAddressVersion,
ExecutionSuccess<u8>,
try_from_borsh
),
(CallRefundOnError, ExecutionSuccess<u8>, try_from_borsh),
];

#[cfg(feature = "deposit-withdraw")]
Expand Down Expand Up @@ -322,10 +336,10 @@ pub enum View {
EthTotalSupply,
FtMetadata,
StorageBalanceOf,
PausedFlags, // TODO
PausedFlags,
AccountsCounter, // TODO
Erc20FromNep141, // TODO
Nep141FromErc20, // TODO
Erc20FromNep141,
Nep141FromErc20,
}

impl AsRef<str> for View {
Expand Down Expand Up @@ -401,25 +415,19 @@ impl AsRef<str> for OwnerCall {

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum SelfCall {
NewEthConnector,
SetEthConnectorContractData,
FactoryUpdateAddressVersion,
RefundOnError,
FinishDeposit,
FtResolveTransfer,
SetPausedFlags,
}

impl AsRef<str> for SelfCall {
fn as_ref(&self) -> &str {
use SelfCall::*;
match self {
NewEthConnector => "new_eth_connector",
SetEthConnectorContractData => "set_eth_connector_contract_data",
FactoryUpdateAddressVersion => "factory_update_address_version",
RefundOnError => "refund_on_error",
FinishDeposit => "finish_deposit",
FtResolveTransfer => "resolve_transfer",
SetPausedFlags => "set_paused_flags",
}
}
Expand Down
52 changes: 52 additions & 0 deletions workspace/tests/self_call_tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
use aurora_engine::fungible_token::FungibleTokenMetadata;
use aurora_workspace_types::Address;

mod common;

#[tokio::test]
async fn test_set_eth_connector_contract_data() {
let contract = common::init_and_deploy_contract().await.unwrap();

contract
.as_account()
.set_eth_connector_contract_data(
"prover.test.near",
"custodian.test.near",
FungibleTokenMetadata::default(),
)
.transact()
.await
.unwrap();
}

#[tokio::test]
async fn test_factory_update_address_version() {
let contract = common::init_and_deploy_contract().await.unwrap();

let res = contract
.as_account()
.factory_update_address_version(Address::default(), 0)
.transact()
.await
.unwrap()
.into_value();

let expected = 0;
assert_eq!(expected, res);
}

#[tokio::test]
async fn test_refund_on_error() {
let contract = common::init_and_deploy_contract().await.unwrap();

let res = contract
.as_account()
.refund_on_error(Address::default(), Some(Address::default()), 0.into())
.transact()
.await
.unwrap()
.into_value();

let expected = 0;
assert_eq!(expected, res);
}