diff --git a/Cargo.lock b/Cargo.lock index 6e54a59..07ac75e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2348,7 +2348,7 @@ dependencies = [ [[package]] name = "ref-exchange" -version = "1.9.1" +version = "1.9.2" dependencies = [ "hex", "mock-boost-farming", diff --git a/ref-exchange/Cargo.toml b/ref-exchange/Cargo.toml index 1009ba3..d1d593f 100644 --- a/ref-exchange/Cargo.toml +++ b/ref-exchange/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ref-exchange" -version = "1.9.1" +version = "1.9.2" authors = ["Illia Polosukhin "] edition = "2018" publish = false diff --git a/ref-exchange/release_notes.md b/ref-exchange/release_notes.md index 79091a8..1202945 100644 --- a/ref-exchange/release_notes.md +++ b/ref-exchange/release_notes.md @@ -1,5 +1,10 @@ # Release Notes +### Version 1.9.2 +``` +52Fmd38fqZbHoGQGRTmoXxr9xMu8zKQWaGggHSJYi23T +``` +1. margin trading ### Version 1.9.1 ``` diff --git a/ref-exchange/src/account_deposit.rs b/ref-exchange/src/account_deposit.rs index 4b8bc7a..8bca251 100644 --- a/ref-exchange/src/account_deposit.rs +++ b/ref-exchange/src/account_deposit.rs @@ -11,7 +11,7 @@ use near_sdk::{ AccountId, Balance, PromiseResult, StorageUsage, }; use crate::legacy::{AccountV1, AccountV2}; -use crate::utils::{ext_self, ext_wrap_near, GAS_FOR_FT_TRANSFER, GAS_FOR_RESOLVE_TRANSFER, GAS_FOR_NEAR_WITHDRAW}; +use crate::utils::{ext_self, ext_wrap_near, GAS_FOR_FT_TRANSFER, GAS_FOR_FT_TRANSFER_CALL, GAS_FOR_RESOLVE_TRANSFER, GAS_FOR_NEAR_WITHDRAW}; use crate::*; // [AUDIT_01] @@ -635,4 +635,30 @@ impl Contract { )) } } + + pub(crate) fn internal_send_token_with_msg( + &self, + sender_id: &AccountId, + token_id: &AccountId, + amount: Balance, + msg: String + ) -> Promise { + ext_fungible_token::ft_transfer_call( + sender_id.clone(), + U128(amount), + None, + msg, + token_id, + 1, + GAS_FOR_FT_TRANSFER_CALL, + ) + .then(ext_self::exchange_callback_post_withdraw( + token_id.clone(), + sender_id.clone(), + U128(amount), + &env::current_account_id(), + 0, + GAS_FOR_RESOLVE_TRANSFER, + )) + } } diff --git a/ref-exchange/src/token_receiver.rs b/ref-exchange/src/token_receiver.rs index e851b14..759a00e 100644 --- a/ref-exchange/src/token_receiver.rs +++ b/ref-exchange/src/token_receiver.rs @@ -26,6 +26,9 @@ enum TokenReceiverMessage { referral_id: Option, /// List of sequential actions. actions: Vec, + /// If not None, use ft_transfer_call + /// to send token_out back to predecessor with this msg. + client_echo: Option, skip_unwrap_near: Option, }, HotZap { @@ -100,6 +103,7 @@ impl FungibleTokenReceiver for Contract { TokenReceiverMessage::Execute { referral_id, actions, + client_echo, skip_unwrap_near } => { let referral_id = referral_id.map(|x| x.to_string()); @@ -109,8 +113,15 @@ impl FungibleTokenReceiver for Contract { referral_id, &actions, ); + if client_echo.is_some() && sender_id.to_string() == self.burrowland_id { + assert!(out_amounts.len() == 1, "Invalid actions, only one out token is allowed"); + } for (token_out, amount_out) in out_amounts.into_iter() { - self.internal_send_tokens(sender_id.as_ref(), &token_out, amount_out, skip_unwrap_near); + if let Some(ref message) = client_echo { + self.internal_send_token_with_msg(sender_id.as_ref(), &token_out, amount_out, message.clone()); + } else { + self.internal_send_tokens(sender_id.as_ref(), &token_out, amount_out, skip_unwrap_near); + } } // Even if send tokens fails, we don't return funds back to sender. PromiseOrValue::Value(U128(0)) diff --git a/ref-exchange/tests/test_migrate.rs b/ref-exchange/tests/test_migrate.rs index edafebe..a878c1c 100644 --- a/ref-exchange/tests/test_migrate.rs +++ b/ref-exchange/tests/test_migrate.rs @@ -9,7 +9,7 @@ use crate::common::utils::*; pub mod common; near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { - PREV_EXCHANGE_WASM_BYTES => "../releases/ref_exchange_release.wasm", + PREV_EXCHANGE_WASM_BYTES => "../releases/ref_exchange_release_v191.wasm", EXCHANGE_WASM_BYTES => "../res/ref_exchange.wasm", } @@ -26,7 +26,9 @@ fn test_upgrade() { ValidAccountId::try_from("boost_farm".to_string()).unwrap(), ValidAccountId::try_from("burrowland".to_string()).unwrap(), 4, 1) ); - + let metadata = get_metadata(&pool); + assert_eq!(metadata.version, "1.9.1".to_string()); + // Failed upgrade with no permissions. let result = test_user .call( @@ -49,7 +51,7 @@ fn test_upgrade() { .assert_success(); let metadata = get_metadata(&pool); // println!("{:#?}", metadata); - assert_eq!(metadata.version, "1.9.1".to_string()); + assert_eq!(metadata.version, "1.9.2".to_string()); assert_eq!(metadata.admin_fee_bps, 5); assert_eq!(metadata.boost_farm_id, "boost_farm".to_string()); assert_eq!(metadata.burrowland_id, "burrowland".to_string()); diff --git a/releases/ref_exchange_release.wasm b/releases/ref_exchange_release.wasm index 9b35f6f..3305e8a 100644 Binary files a/releases/ref_exchange_release.wasm and b/releases/ref_exchange_release.wasm differ diff --git a/releases/ref_exchange_release_v191.wasm b/releases/ref_exchange_release_v191.wasm new file mode 100644 index 0000000..9b35f6f Binary files /dev/null and b/releases/ref_exchange_release_v191.wasm differ