From 04480abe4585b75a663e1d7fae673da7d7fe7ea3 Mon Sep 17 00:00:00 2001 From: Bharath Vedartham Date: Wed, 17 Aug 2022 14:02:27 +0530 Subject: [PATCH] Ensure that sender and receiver are not the same in ft_transfer --- contracts/near-x/src/errors.rs | 2 + .../src/fungible_token/nearx_internal.rs | 10 ++- contracts/near-x/tests/unit_tests.rs | 77 ++++++++++++++++++ res/near_x.wasm | Bin 508917 -> 508974 bytes 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/contracts/near-x/src/errors.rs b/contracts/near-x/src/errors.rs index cea92c8..6beaa25 100644 --- a/contracts/near-x/src/errors.rs +++ b/contracts/near-x/src/errors.rs @@ -35,6 +35,8 @@ pub const ERROR_EXPECT_RESULT_ON_CALLBACK: &str = "Callback expected result on c pub const ERROR_MIN_DEPOSIT_TOO_HIGH: &str = "Min deposit too high"; pub const ERROR_TEMP_REWARD_FEE_SET_IN_WAIT_PERIOD: &str = "Still in wait period for reward fee to be set"; +pub const ERROR_SENDER_RECEIVER_SAME: &str = "Sender and receiver cannot be the same"; +pub const ERROR_REQUIRE_AMOUNT_GT_0: &str = "Amount should be greater than 0"; /// Validator related errors pub const ERROR_VALIDATOR_NOT_PAUSED: &str = "Validator not paused"; diff --git a/contracts/near-x/src/fungible_token/nearx_internal.rs b/contracts/near-x/src/fungible_token/nearx_internal.rs index aa0802e..d29bc32 100644 --- a/contracts/near-x/src/fungible_token/nearx_internal.rs +++ b/contracts/near-x/src/fungible_token/nearx_internal.rs @@ -1,6 +1,7 @@ use crate::contract::NearxPool; +use crate::errors::{ERROR_REQUIRE_AMOUNT_GT_0, ERROR_SENDER_RECEIVER_SAME}; use near_sdk::json_types::U128; -use near_sdk::{env, log, AccountId, Balance, PromiseResult}; +use near_sdk::{env, log, require, AccountId, Balance, PromiseResult}; impl NearxPool { pub fn internal_nearx_transfer( @@ -9,7 +10,8 @@ impl NearxPool { receiver_id: &AccountId, amount: u128, ) { - assert!(amount > 0, "The amount should be a positive number"); + require!(sender_id != receiver_id, ERROR_SENDER_RECEIVER_SAME); + require!(amount > 0, ERROR_REQUIRE_AMOUNT_GT_0); let mut sender_acc = self.internal_get_account(sender_id); let mut receiver_acc = self.internal_get_account(receiver_id); assert!( @@ -20,9 +22,9 @@ impl NearxPool { ); sender_acc.stake_shares -= amount; - receiver_acc.stake_shares += amount; - self.internal_update_account(sender_id, &sender_acc); + + receiver_acc.stake_shares += amount; self.internal_update_account(receiver_id, &receiver_acc); } diff --git a/contracts/near-x/tests/unit_tests.rs b/contracts/near-x/tests/unit_tests.rs index a176865..46619cc 100644 --- a/contracts/near-x/tests/unit_tests.rs +++ b/contracts/near-x/tests/unit_tests.rs @@ -2,6 +2,7 @@ mod helpers; use crate::helpers::abs_diff_eq; use helpers::ntoy; +use near_contract_standards::fungible_token::core::FungibleTokenCore; use near_sdk::json_types::{U128, U64}; use near_sdk::test_utils::testing_env_with_promise_results; use near_sdk::{ @@ -2891,3 +2892,79 @@ fn test_pause_validator() { assert_eq!(contract.total_validator_weight, 50); } + +#[test] +#[should_panic] +fn test_ft_transfer_same_user() { + let (mut context, mut contract) = + contract_setup(owner_account(), operator_account(), treasury_account()); + + let user1_account_id = AccountId::from_str("user1").unwrap(); + + let user1_account = Account { + stake_shares: ntoy(10), + unstaked_amount: 0, + withdrawable_epoch_height: 0, + }; + + update_account(&mut contract, user1_account_id.clone(), &user1_account); + + context.predecessor_account_id = user1_account_id.clone(); + context.attached_deposit = 1; + testing_env!(context.clone()); + + contract.ft_transfer(user1_account_id.clone(), U128(ntoy(5)), None); + + let user1_account = get_account(&contract, user1_account_id.clone()); + assert_eq!( + user1_account, + Account { + stake_shares: ntoy(10), + unstaked_amount: 0, + withdrawable_epoch_height: 0 + } + ); +} + +#[test] +fn test_ft_transfer() { + let (mut context, mut contract) = + contract_setup(owner_account(), operator_account(), treasury_account()); + + let user1_account_id = AccountId::from_str("user1").unwrap(); + let user2_account_id = AccountId::from_str("user2").unwrap(); + + let user1_account = Account { + stake_shares: ntoy(10), + unstaked_amount: 0, + withdrawable_epoch_height: 0, + }; + + update_account(&mut contract, user1_account_id.clone(), &user1_account); + + context.predecessor_account_id = user1_account_id.clone(); + context.attached_deposit = 1; + testing_env!(context.clone()); + + contract.ft_transfer(user2_account_id.clone(), U128(ntoy(5)), None); + + let user1_account = get_account(&contract, user1_account_id.clone()); + assert_eq!( + user1_account, + Account { + stake_shares: ntoy(5), + unstaked_amount: 0, + withdrawable_epoch_height: 0 + } + ); + + let user2_account = get_account(&contract, user2_account_id.clone()); + assert_eq!( + user2_account, + Account { + stake_shares: ntoy(5), + unstaked_amount: 0, + withdrawable_epoch_height: 0 + } + ); +} diff --git a/res/near_x.wasm b/res/near_x.wasm index a6308ba8d2132658d588ed4a098213cef1b54b32..d1725998d0804adc261f468c46f1687b654b6239 100755 GIT binary patch delta 32763 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 Q@E-PhAwH||nTgN;0j>Z(asU7T delta 32393 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 bj^A{Z&z1uOzdx}1Pveu0&v*EIfY1K{Apfq+