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

Fast Transfers #147

Open
wants to merge 18 commits into
base: main
Choose a base branch
from
Open
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
551 changes: 420 additions & 131 deletions near/omni-bridge/src/lib.rs

Large diffs are not rendered by default.

26 changes: 24 additions & 2 deletions near/omni-bridge/src/storage.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use near_contract_standards::storage_management::{StorageBalance, StorageBalanceBounds};
use near_sdk::{assert_one_yocto, borsh, near};
use near_sdk::{env, near_bindgen, AccountId, NearToken};
use omni_types::TransferId;
use omni_types::{FastTransferStatus, TransferId};

use crate::{
require, ChainKind, Contract, ContractExt, Fee, OmniAddress, Promise, SdkExpect,
Expand Down Expand Up @@ -166,6 +166,10 @@ impl Contract {
sender: OmniAddress::Near(max_account_id.clone()),
msg: String::new(),
destination_nonce: 0,
origin_transfer_id: Some(TransferId {
origin_chain: ChainKind::Near,
origin_nonce: 0,
}),
},
owner: max_account_id,
}))
Expand All @@ -179,7 +183,7 @@ impl Contract {
}

pub fn required_balance_for_fin_transfer(&self) -> NearToken {
let key_len: u64 = borsh::to_vec(&(ChainKind::Eth, 0_u128))
let key_len: u64 = borsh::to_vec(&(ChainKind::Eth, 0_u64))
.sdk_expect("ERR_BORSH")
.len()
.try_into()
Expand All @@ -192,6 +196,24 @@ impl Contract {
storage_cost.saturating_add(ft_transfers_cost)
}

pub fn required_balance_for_fast_transfer(&self) -> NearToken {
let key_len = borsh::to_vec(&[0u8; 32]).sdk_expect("ERR_BORSH").len() as u64;

let max_account_id: AccountId = "a".repeat(64).parse().sdk_expect("ERR_PARSE_ACCOUNT_ID");
let value_len = borsh::to_vec(&FastTransferStatus {
relayer: max_account_id,
finalised: false,
})
.sdk_expect("ERR_BORSH")
.len() as u64;

let storage_cost = env::storage_byte_cost()
.saturating_mul((Self::get_basic_storage() + key_len + value_len).into());
let ft_transfers_cost = NearToken::from_yoctonear(1);

storage_cost.saturating_add(ft_transfers_cost)
}

pub fn required_balance_for_bind_token(&self) -> NearToken {
let max_token_id: AccountId = "a".repeat(64).parse().sdk_expect("ERR_PARSE_ACCOUNT_ID");

Expand Down
33 changes: 19 additions & 14 deletions near/omni-bridge/src/tests/lib_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ use near_sdk::{
use omni_types::{
locker_args::StorageDepositAction,
prover_result::{InitTransferMessage, ProverResult},
ChainKind, EvmAddress, Fee, InitTransferMsg, Nonce, OmniAddress, TransferId, TransferMessage,
UpdateFee,
BridgeOnTransferMsg, ChainKind, EvmAddress, Fee, InitTransferMsg, Nonce, OmniAddress,
TransferId, TransferMessage, UpdateFee,
};

use crate::storage::Decimals;
Expand Down Expand Up @@ -95,7 +95,7 @@ fn run_ft_on_transfer(
token_id: String,
amount: U128,
attached_deposit: Option<NearToken>,
msg: &InitTransferMsg,
msg: &BridgeOnTransferMsg,
) -> PromiseOrValue<U128> {
let sender_id = AccountId::try_from(sender_id).expect("Invalid sender ID");
let token_id = AccountId::try_from(token_id).expect("Invalid token ID");
Expand All @@ -111,7 +111,7 @@ fn run_ft_on_transfer(
run_storage_deposit(contract, sender_id.clone(), attached_deposit);
setup_test_env(token_id.clone(), NearToken::from_yoctonear(0), None);

let msg = serde_json::to_string(&msg).expect("Failed to serialize transfer message");
let msg = serde_json::to_string(msg).expect("Failed to serialize transfer message");

contract.ft_on_transfer(sender_id, amount, msg)
}
Expand All @@ -127,7 +127,7 @@ fn test_initialize_contract() {
}

#[test]
fn test_ft_on_transfer_nonce_increment() {
fn test_init_transfer_nonce_increment() {
let mut contract = get_default_contract();

run_ft_on_transfer(
Expand All @@ -136,14 +136,14 @@ fn test_ft_on_transfer_nonce_increment() {
DEFAULT_FT_CONTRACT_ACCOUNT.to_string(),
U128(100),
None,
&get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS, 0, 0),
&BridgeOnTransferMsg::InitTransfer(get_init_transfer_msg(&DEFAULT_ETH_USER_ADDRESS, 0, 0)),
);

assert_eq!(contract.current_origin_nonce, DEFAULT_NONCE + 1);
}

#[test]
fn test_ft_on_transfer_stored_transfer_message() {
fn test_init_transfer_stored_transfer_message() {
let mut contract = get_default_contract();

let msg = get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS, 0, 0);
Expand All @@ -153,7 +153,7 @@ fn test_ft_on_transfer_stored_transfer_message() {
DEFAULT_FT_CONTRACT_ACCOUNT.to_string(),
U128(DEFAULT_TRANSFER_AMOUNT),
None,
&msg,
&BridgeOnTransferMsg::InitTransfer(msg.clone()),
);

let stored_transfer = contract.get_transfer_message(TransferId {
Expand Down Expand Up @@ -187,7 +187,7 @@ fn test_ft_on_transfer_stored_transfer_message() {
}

#[test]
fn test_ft_on_transfer_promise_result() {
fn test_init_transfer_promise_result() {
let mut contract = get_default_contract();

let promise = run_ft_on_transfer(
Expand All @@ -196,7 +196,7 @@ fn test_ft_on_transfer_promise_result() {
DEFAULT_FT_CONTRACT_ACCOUNT.to_string(),
U128(DEFAULT_TRANSFER_AMOUNT),
None,
&get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS, 0, 0),
&BridgeOnTransferMsg::InitTransfer(get_init_transfer_msg(&DEFAULT_ETH_USER_ADDRESS, 0, 0)),
);

let remaining = match promise {
Expand All @@ -208,20 +208,24 @@ fn test_ft_on_transfer_promise_result() {

#[test]
#[should_panic(expected = "ERR_INVALID_FEE")]
fn test_ft_on_transfer_invalid_fee() {
fn test_init_transfer_invalid_fee() {
let mut contract = get_default_contract();
run_ft_on_transfer(
&mut contract,
DEFAULT_NEAR_USER_ACCOUNT.to_string(),
DEFAULT_FT_CONTRACT_ACCOUNT.to_string(),
U128(DEFAULT_TRANSFER_AMOUNT),
None,
&get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS, DEFAULT_TRANSFER_AMOUNT + 1, 0),
&BridgeOnTransferMsg::InitTransfer(get_init_transfer_msg(
&DEFAULT_ETH_USER_ADDRESS,
DEFAULT_TRANSFER_AMOUNT + 1,
0,
)),
);
}

#[test]
fn test_ft_on_transfer_balance_updated() {
fn test_init_transfer_balance_updated() {
let mut contract = get_default_contract();

let min_storage_balance = contract.required_balance_for_account();
Expand All @@ -234,7 +238,7 @@ fn test_ft_on_transfer_balance_updated() {
DEFAULT_FT_CONTRACT_ACCOUNT.to_string(),
U128(DEFAULT_TRANSFER_AMOUNT),
Some(total_balance),
&get_init_transfer_msg(DEFAULT_ETH_USER_ADDRESS, 0, 0),
&BridgeOnTransferMsg::InitTransfer(get_init_transfer_msg(&DEFAULT_ETH_USER_ADDRESS, 0, 0)),
);

let storage_balance = contract
Expand Down Expand Up @@ -267,6 +271,7 @@ fn run_update_transfer_fee(
sender: OmniAddress::Near(sender_id.clone().parse().unwrap()),
msg: String::new(),
destination_nonce: 1,
origin_transfer_id: None,
};

contract.insert_raw_transfer(
Expand Down
Loading
Loading