From 4f1be24fde4b6628dde05d2ae50111e2099faca2 Mon Sep 17 00:00:00 2001 From: mootz12 Date: Wed, 1 May 2024 09:32:12 -0400 Subject: [PATCH 1/5] fix: swap map for vec for drop list --- backstop/src/contract.rs | 6 +++--- backstop/src/storage.rs | 11 +++++------ emitter/src/contract.rs | 8 ++++---- emitter/src/emitter.rs | 18 +++++++++--------- pool/src/testutils.rs | 6 ++---- test-suites/src/test_fixture.rs | 13 ++++++++++--- test-suites/tests/test_backstop.rs | 4 ++-- 7 files changed, 35 insertions(+), 31 deletions(-) diff --git a/backstop/src/contract.rs b/backstop/src/contract.rs index 72f6ecf7..e14db729 100644 --- a/backstop/src/contract.rs +++ b/backstop/src/contract.rs @@ -6,7 +6,7 @@ use crate::{ storage, }; use soroban_sdk::{ - contract, contractclient, contractimpl, panic_with_error, Address, Env, Map, Symbol, Vec, + contract, contractclient, contractimpl, panic_with_error, Address, Env, Symbol, Vec, }; /// ### Backstop @@ -38,7 +38,7 @@ pub trait Backstop { blnd_token: Address, usdc_token: Address, pool_factory: Address, - drop_list: Map, + drop_list: Vec<(Address, i128)>, ); /********** Core **********/ @@ -184,7 +184,7 @@ impl Backstop for BackstopContract { usdc_token: Address, blnd_token: Address, pool_factory: Address, - drop_list: Map, + drop_list: Vec<(Address, i128)>, ) { storage::extend_instance(&e); if storage::get_is_init(&e) { diff --git a/backstop/src/storage.rs b/backstop/src/storage.rs index 112c75db..187f251f 100644 --- a/backstop/src/storage.rs +++ b/backstop/src/storage.rs @@ -1,6 +1,5 @@ use soroban_sdk::{ - contracttype, unwrap::UnwrapOptimized, vec, Address, Env, IntoVal, Map, Symbol, TryFromVal, - Val, Vec, + contracttype, unwrap::UnwrapOptimized, vec, Address, Env, IntoVal, Symbol, TryFromVal, Val, Vec, }; use crate::backstop::{PoolBalance, UserBalance}; @@ -466,10 +465,10 @@ pub fn set_user_emis_data( /********** Drop Emissions **********/ /// Get the current pool addresses that are in the drop list and the amount of the initial distribution they receive -pub fn get_drop_list(e: &Env) -> Map { +pub fn get_drop_list(e: &Env) -> Vec<(Address, i128)> { e.storage() .temporary() - .get::>(&Symbol::new(&e, DROP_LIST_KEY)) + .get::>(&Symbol::new(&e, DROP_LIST_KEY)) .unwrap_optimized() } @@ -477,10 +476,10 @@ pub fn get_drop_list(e: &Env) -> Map { /// /// ### Arguments /// * `drop_list` - The map of pool addresses to the amount of the initial distribution they receive -pub fn set_drop_list(e: &Env, drop_list: &Map) { +pub fn set_drop_list(e: &Env, drop_list: &Vec<(Address, i128)>) { e.storage() .temporary() - .set::>(&Symbol::new(&e, DROP_LIST_KEY), drop_list); + .set::>(&Symbol::new(&e, DROP_LIST_KEY), drop_list); e.storage().temporary().extend_ttl( &Symbol::new(&e, DROP_LIST_KEY), LEDGER_THRESHOLD_USER, diff --git a/emitter/src/contract.rs b/emitter/src/contract.rs index 91d2476c..16021ff4 100644 --- a/emitter/src/contract.rs +++ b/emitter/src/contract.rs @@ -1,6 +1,6 @@ use crate::{backstop_manager, emitter, errors::EmitterError, storage}; use soroban_sdk::{ - contract, contractclient, contractimpl, panic_with_error, Address, Env, Map, Symbol, + contract, contractclient, contractimpl, panic_with_error, Address, Env, Symbol, Vec, }; /// ### Emitter @@ -61,7 +61,7 @@ pub trait Emitter { /// or if the queued swap has not been unlocked. fn swap_backstop(e: Env); - /// Distributes initial BLND after a new backstop is set + /// (Backstop only) Distributes initial BLND after a new backstop is set /// /// ### Arguments /// * `list` - The list of address and amounts to distribute too @@ -69,7 +69,7 @@ pub trait Emitter { /// ### Errors /// If drop has already been called for the backstop, the backstop is not the caller, /// or the list exceeds the drop amount maximum. - fn drop(e: Env, list: Map); + fn drop(e: Env, list: Vec<(Address, i128)>); } #[contractimpl] @@ -135,7 +135,7 @@ impl Emitter for EmitterContract { e.events().publish((Symbol::new(&e, "swap"),), swap); } - fn drop(e: Env, list: Map) { + fn drop(e: Env, list: Vec<(Address, i128)>) { storage::extend_instance(&e); emitter::execute_drop(&e, &list); diff --git a/emitter/src/emitter.rs b/emitter/src/emitter.rs index 898ec74d..51de3744 100644 --- a/emitter/src/emitter.rs +++ b/emitter/src/emitter.rs @@ -1,6 +1,6 @@ use crate::{constants::SCALAR_7, errors::EmitterError, storage}; use sep_41_token::StellarAssetClient; -use soroban_sdk::{panic_with_error, Address, Env, Map}; +use soroban_sdk::{panic_with_error, Address, Env, Vec}; /// Perform a distribution pub fn execute_distribute(e: &Env, backstop: &Address) -> i128 { @@ -18,7 +18,7 @@ pub fn execute_distribute(e: &Env, backstop: &Address) -> i128 { } /// Perform drop BLND distribution -pub fn execute_drop(e: &Env, list: &Map) { +pub fn execute_drop(e: &Env, list: &Vec<(Address, i128)>) { let backstop = storage::get_backstop(e); backstop.require_auth(); @@ -51,8 +51,8 @@ mod tests { use super::*; use sep_41_token::testutils::MockTokenClient; use soroban_sdk::{ - map, testutils::{Address as _, Ledger, LedgerInfo}, + vec, }; #[test] @@ -112,10 +112,10 @@ mod tests { let blnd_id = e.register_stellar_asset_contract(emitter.clone()); let blnd_client = MockTokenClient::new(&e, &blnd_id); - let drop_list = map![ + let drop_list = vec![ &e, (frodo.clone(), 20_000_000 * SCALAR_7), - (samwise.clone(), 30_000_000 * SCALAR_7) + (samwise.clone(), 30_000_000 * SCALAR_7), ]; e.as_contract(&emitter, || { @@ -153,10 +153,10 @@ mod tests { let backstop = Address::generate(&e); let blnd_id = e.register_stellar_asset_contract(emitter.clone()); - let drop_list = map![ + let drop_list = vec![ &e, (frodo.clone(), 20_000_000 * SCALAR_7), - (samwise.clone(), 30_000_000 * SCALAR_7) + (samwise.clone(), 30_000_000 * SCALAR_7), ]; e.as_contract(&emitter, || { @@ -193,10 +193,10 @@ mod tests { let backstop = Address::generate(&e); let blnd_id = e.register_stellar_asset_contract(emitter.clone()); - let drop_list = map![ + let drop_list = vec![ &e, (frodo.clone(), 20_000_000 * SCALAR_7), - (samwise.clone(), 30_000_001 * SCALAR_7) + (samwise.clone(), 30_000_001 * SCALAR_7), ]; e.as_contract(&emitter, || { diff --git a/pool/src/testutils.rs b/pool/src/testutils.rs index 86d4e63f..9b9063c5 100644 --- a/pool/src/testutils.rs +++ b/pool/src/testutils.rs @@ -10,9 +10,7 @@ use emitter::{EmitterClient, EmitterContract}; use sep_40_oracle::testutils::{MockPriceOracleClient, MockPriceOracleWASM}; use sep_41_token::testutils::{MockTokenClient, MockTokenWASM}; use soroban_fixed_point_math::FixedPoint; -use soroban_sdk::{ - map, testutils::Address as _, unwrap::UnwrapOptimized, vec, Address, Env, IntoVal, -}; +use soroban_sdk::{testutils::Address as _, unwrap::UnwrapOptimized, vec, Address, Env, IntoVal}; use backstop::{BackstopClient, BackstopContract}; use mock_pool_factory::{MockPoolFactory, MockPoolFactoryClient}; @@ -117,7 +115,7 @@ pub(crate) fn setup_backstop( usdc_token, blnd_token, &pool_factory, - &map![e, (pool_address.clone(), 50_000_000 * SCALAR_7)], + &vec![e, (pool_address.clone(), 50_000_000 * SCALAR_7)], ); e.as_contract(pool_address, || { storage::set_backstop(e, backstop_id); diff --git a/test-suites/src/test_fixture.rs b/test-suites/src/test_fixture.rs index 59b9104f..030f71c9 100644 --- a/test-suites/src/test_fixture.rs +++ b/test-suites/src/test_fixture.rs @@ -69,6 +69,7 @@ impl TestFixture<'_> { e.budget().reset_unlimited(); let bombadil = Address::generate(&e); + let frodo = Address::generate(&e); e.ledger().set(LedgerInfo { timestamp: 1441065600, // Sept 1st, 2015 (backstop epoch) @@ -97,7 +98,6 @@ impl TestFixture<'_> { let (lp, lp_client) = create_lp_pool(&e, &bombadil, &blnd_id, &usdc_id); // initialize emitter - blnd_client.mint(&bombadil, &(10_000_000 * SCALAR_7)); blnd_client.set_admin(&emitter_id); emitter_client.initialize(&blnd_id, &backstop_id, &lp); @@ -108,7 +108,11 @@ impl TestFixture<'_> { &usdc_id, &blnd_id, &pool_factory_id, - &Map::new(&e), + &svec![ + &e, + (bombadil.clone(), 10_000_000 * SCALAR_7), + (frodo.clone(), 40_000_000 * SCALAR_7) + ], ); // initialize pool factory @@ -121,6 +125,9 @@ impl TestFixture<'_> { let pool_factory_client = PoolFactoryClient::new(&e, &pool_factory_id); pool_factory_client.initialize(&pool_init_meta); + // drop tokens to bombadil + backstop_client.drop(); + // initialize oracle let (_, mock_oracle_client) = create_mock_oracle(&e); mock_oracle_client.set_data( @@ -147,7 +154,7 @@ impl TestFixture<'_> { let fixture = TestFixture { env: e, bombadil, - users: vec![], + users: vec![frodo], emitter: emitter_client, backstop: backstop_client, pool_factory: pool_factory_client, diff --git a/test-suites/tests/test_backstop.rs b/test-suites/tests/test_backstop.rs index aa465327..a6645396 100644 --- a/test-suites/tests/test_backstop.rs +++ b/test-suites/tests/test_backstop.rs @@ -3,7 +3,7 @@ use soroban_fixed_point_math::FixedPoint; use soroban_sdk::{ testutils::{Address as _, AuthorizedFunction, AuthorizedInvocation, Events}, - vec, Address, IntoVal, Map, Symbol, Val, Vec, + vec, Address, IntoVal, Symbol, Val, Vec, }; use test_suites::{ assertions::assert_approx_eq_abs, @@ -29,7 +29,7 @@ fn test_backstop() { &Address::generate(&fixture.env), &Address::generate(&fixture.env), &Address::generate(&fixture.env), - &Map::new(&fixture.env), + &vec![&fixture.env], ); assert!(result.is_err()); assert_eq!( From daa1660c8352790fa5e89d834e76c59cff64a78b Mon Sep 17 00:00:00 2001 From: mootz12 Date: Wed, 1 May 2024 09:33:28 -0400 Subject: [PATCH 2/5] fix: ensure PoolBackstopData fetch returns for empty backstop --- backstop/src/backstop/pool.rs | 40 +++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/backstop/src/backstop/pool.rs b/backstop/src/backstop/pool.rs index 6f5b1e6a..4ec3364c 100644 --- a/backstop/src/backstop/pool.rs +++ b/backstop/src/backstop/pool.rs @@ -15,10 +15,14 @@ pub struct PoolBackstopData { pub fn load_pool_backstop_data(e: &Env, address: &Address) -> PoolBackstopData { let pool_balance = storage::get_pool_balance(e, address); - let q4w_pct = pool_balance - .q4w - .fixed_div_ceil(pool_balance.shares, SCALAR_7) - .unwrap_optimized(); + let q4w_pct = if pool_balance.shares > 0 { + pool_balance + .q4w + .fixed_div_ceil(pool_balance.shares, SCALAR_7) + .unwrap_optimized() + } else { + 0 + }; let (blnd_per_tkn, usdc_per_tkn) = storage::get_lp_token_val(e); let blnd = pool_balance @@ -202,6 +206,34 @@ mod tests { }); } + #[test] + fn test_load_pool_data_no_shares() { + let e = Env::default(); + + let backstop_address = create_backstop(&e); + let pool = Address::generate(&e); + + e.as_contract(&backstop_address, || { + storage::set_pool_balance( + &e, + &pool, + &PoolBalance { + shares: 0, + tokens: 250_0000000, + q4w: 0, + }, + ); + storage::set_lp_token_val(&e, &(5_0000000, 0_0500000)); + + let pool_data = load_pool_backstop_data(&e, &pool); + + assert_eq!(pool_data.tokens, 250_0000000); + assert_eq!(pool_data.q4w_pct, 0); + assert_eq!(pool_data.blnd, 1_250_0000000); + assert_eq!(pool_data.usdc, 12_5000000); + }); + } + /********** require_is_from_pool_factory **********/ #[test] From a1fcf09de6f69a07ad6d615f3b9084a4f5300f43 Mon Sep 17 00:00:00 2001 From: mootz12 Date: Wed, 1 May 2024 09:34:29 -0400 Subject: [PATCH 3/5] chore: add patched comet version and fix tests due to comet rounding update --- backstop/src/dependencies/mod.rs | 3 +- backstop/src/emissions/claim.rs | 54 +++++++++++----------- backstop/src/testutils.rs | 14 ++---- blend-contract-sdk/src/testutils.rs | 23 ++------- comet.wasm | Bin 35006 -> 29046 bytes pool/src/dependencies/mod.rs | 2 - pool/src/testutils.rs | 14 ++---- test-suites/src/liquidity_pool.rs | 13 ++---- test-suites/src/setup.rs | 43 +++++++---------- test-suites/tests/test_emitter.rs | 18 +++----- test-suites/tests/test_wasm_happy_path.rs | 6 +-- 11 files changed, 71 insertions(+), 119 deletions(-) mode change 100644 => 100755 comet.wasm diff --git a/backstop/src/dependencies/mod.rs b/backstop/src/dependencies/mod.rs index 89463a25..0057d802 100644 --- a/backstop/src/dependencies/mod.rs +++ b/backstop/src/dependencies/mod.rs @@ -3,7 +3,8 @@ pub use pool_factory::Client as PoolFactoryClient; mod comet; pub use comet::Client as CometClient; -#[cfg(any(test, feature = "testutils"))] + +#[cfg(test)] pub use comet::WASM as COMET_WASM; mod emitter; diff --git a/backstop/src/emissions/claim.rs b/backstop/src/emissions/claim.rs index d8f8c665..32186556 100644 --- a/backstop/src/emissions/claim.rs +++ b/backstop/src/emissions/claim.rs @@ -212,7 +212,7 @@ mod tests { assert_eq!(result, 75_3145677 + 6_2904190); assert_eq!( lp_client.balance(&backstop_address), - backstop_lp_balance + 6_5244800 + backstop_lp_balance + 6_4729326 ); assert_eq!( blnd_token_client.balance(&backstop_address), @@ -221,18 +221,18 @@ mod tests { let sam_balance_1 = storage::get_user_balance(&e, &pool_1_id, &samwise); assert_eq!(sam_balance_1.shares, 9_0000000); let frodo_balance_1 = storage::get_user_balance(&e, &pool_1_id, &frodo); - assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_5761820); + assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_5400274); let sam_balance_2 = storage::get_user_balance(&e, &pool_2_id, &samwise); assert_eq!(sam_balance_2.shares, 7_5000000); let frodo_balance_2 = storage::get_user_balance(&e, &pool_2_id, &frodo); - assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 0_3947102); + assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 0_3915917); let pool_balance_1 = storage::get_pool_balance(&e, &pool_1_id); - assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 6_1015761); - assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_5761820); + assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 6_0533699); + assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_5400274); let pool_balance_2 = storage::get_pool_balance(&e, &pool_2_id); - assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 0_4229038); - assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 0_3947102); + assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 0_4195626); + assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 0_3915917); let new_backstop_1_data = storage::get_backstop_emis_data(&e, &pool_1_id).unwrap_optimized(); @@ -371,7 +371,7 @@ mod tests { assert_eq!(result, 75_3145677 + 6_2904190); assert_eq!( lp_client.balance(&backstop_address), - backstop_lp_balance + 6_5244800 + backstop_lp_balance + 6_4729326 ); assert_eq!( blnd_token_client.balance(&backstop_address), @@ -380,18 +380,18 @@ mod tests { let sam_balance_1 = storage::get_user_balance(&e, &pool_1_id, &samwise); assert_eq!(sam_balance_1.shares, 9_0000000); let frodo_balance_1 = storage::get_user_balance(&e, &pool_1_id, &frodo); - assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_5761820); + assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_5400274); let sam_balance_2 = storage::get_user_balance(&e, &pool_2_id, &samwise); assert_eq!(sam_balance_2.shares, 7_5000000); let frodo_balance_2 = storage::get_user_balance(&e, &pool_2_id, &frodo); - assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 0_3947102); + assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 0_3915917); let pool_balance_1 = storage::get_pool_balance(&e, &pool_1_id); - assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 6_1015761); - assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_5761820); + assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 6_0533699); + assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_5400274); let pool_balance_2 = storage::get_pool_balance(&e, &pool_2_id); - assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 0_4229038); - assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 0_3947102); + assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 0_4195626); + assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 0_3915917); let new_backstop_1_data = storage::get_backstop_emis_data(&e, &pool_1_id).unwrap_optimized(); @@ -435,47 +435,47 @@ mod tests { &vec![&e, pool_1_id.clone(), pool_2_id.clone()], &frodo, ); - assert_eq!(result_1, 1005009202); + assert_eq!(result_1, 1005194703); assert_eq!( blnd_token_client.balance(&backstop_address), - 200_0000000 - (75_3145677 + 6_2904190) - (1005009202) + 200_0000000 - (75_3145677 + 6_2904190) - (1005194703) ); assert_eq!( lp_client.balance(&backstop_address), - backstop_lp_balance + 7_9137036 + backstop_lp_balance + 7_7889107 ); let sam_balance_1 = storage::get_user_balance(&e, &pool_1_id, &samwise); assert_eq!(sam_balance_1.shares, 9_0000000); let frodo_balance_1 = storage::get_user_balance(&e, &pool_1_id, &frodo); - assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_3004891); + assert_eq!(frodo_balance_1.shares, pre_frodo_balance_1 + 4_2609092); let sam_balance_2 = storage::get_user_balance(&e, &pool_2_id, &samwise); assert_eq!(sam_balance_2.shares, 7_5000000); let frodo_balance_2 = storage::get_user_balance(&e, &pool_2_id, &frodo); - assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 2_0344033); + assert_eq!(frodo_balance_2.shares, pre_frodo_balance_2 + 2_0152958); let pool_balance_1 = storage::get_pool_balance(&e, &pool_1_id); - assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 5_7339856); - assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_3004891); + assert_eq!(pool_balance_1.tokens, pre_pool_tokens_1 + 5_6812124); + assert_eq!(pool_balance_1.shares, pre_pool_shares_1 + 4_2609092); let pool_balance_2 = storage::get_pool_balance(&e, &pool_2_id); - assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 2_1797179); - assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 2_0344033); + assert_eq!(pool_balance_2.tokens, pre_pool_tokens_2 + 2_1592456); + assert_eq!(pool_balance_2.shares, pre_pool_shares_2 + 2_0152958); let new_backstop_1_data = storage::get_backstop_emis_data(&e, &pool_1_id).unwrap_optimized(); let new_user_1_data = storage::get_user_emis_data(&e, &pool_1_id, &samwise).unwrap_optimized(); assert_eq!(new_backstop_1_data.last_time, block_timestamp_1); - assert_eq!(new_backstop_1_data.index, 164344784); + assert_eq!(new_backstop_1_data.index, 164363961); assert_eq!(new_user_1_data.accrued, 0); - assert_eq!(new_user_1_data.index, 164344784); + assert_eq!(new_user_1_data.index, 164363961); let new_backstop_2_data = storage::get_backstop_emis_data(&e, &pool_2_id).unwrap_optimized(); let new_user_2_data = storage::get_user_emis_data(&e, &pool_2_id, &samwise).unwrap_optimized(); assert_eq!(new_backstop_2_data.last_time, block_timestamp_1); - assert_eq!(new_backstop_2_data.index, 43961378); + assert_eq!(new_backstop_2_data.index, 43963099); assert_eq!(new_user_2_data.accrued, 0); - assert_eq!(new_user_2_data.index, 43961378); + assert_eq!(new_user_2_data.index, 43963099); }); } diff --git a/backstop/src/testutils.rs b/backstop/src/testutils.rs index 8fb8d027..f9ca72a7 100644 --- a/backstop/src/testutils.rs +++ b/backstop/src/testutils.rs @@ -142,21 +142,15 @@ pub(crate) fn create_comet_lp_pool<'a>( let usdc_client = MockTokenClient::new(e, usdc_token); blnd_client.mint(&admin, &1_000_0000000); usdc_client.mint(&admin, &25_0000000); - let exp_ledger = e.ledger().sequence() + 100; - blnd_client.approve(&admin, &contract_address, &2_000_0000000, &exp_ledger); - usdc_client.approve(&admin, &contract_address, &2_000_0000000, &exp_ledger); - client.init(&Address::generate(e), &admin); - client.bundle_bind( + client.init( + admin, &vec![e, blnd_token.clone(), usdc_token.clone()], + &vec![e, 0_8000000, 0_2000000], &vec![e, 1_000_0000000, 25_0000000], - &vec![e, 8_0000000, 2_0000000], + &0_0030000, ); - client.set_swap_fee(&0_0030000, &admin); - client.set_public_swap(&admin, &true); - client.finalize(); - (contract_address, client) } diff --git a/blend-contract-sdk/src/testutils.rs b/blend-contract-sdk/src/testutils.rs index 1554491d..01b62d73 100644 --- a/blend-contract-sdk/src/testutils.rs +++ b/blend-contract-sdk/src/testutils.rs @@ -1,4 +1,4 @@ -use soroban_sdk::{testutils::Address as _, token::StellarAssetClient, vec, Address, Env, Map}; +use soroban_sdk::{token::StellarAssetClient, vec, Address, Env, Map}; use crate::{backstop, emitter, pool, pool_factory}; @@ -6,10 +6,6 @@ pub mod comet { soroban_sdk::contractimport!(file = "./wasm/comet.wasm"); } -pub mod comet_factory { - soroban_sdk::contractimport!(file = "./wasm/comet_factory.wasm"); -} - /// Create a "good enough" ReserveConfig for most testing usecases /// /// Can be used when creating reserves for a pool. @@ -70,22 +66,13 @@ impl<'a> BlendFixture<'a> { .mint(deployer, &(25_0000000 * 2001)); let comet_client: comet::Client<'a> = comet::Client::new(env, &comet); - comet_client - .mock_all_auths() - .init(&Address::generate(env), deployer); - - comet_client.mock_all_auths().bundle_bind( + comet_client.mock_all_auths().init( + &deployer, &vec![env, blnd.clone(), usdc.clone()], + &vec![env, 0_8000000, 0_2000000], &vec![env, 1_000_0000000, 25_0000000], - &vec![env, 8_0000000, 2_0000000], + &0_0030000, ); - comet_client - .mock_all_auths() - .set_swap_fee(&30000_i128, deployer); - comet_client - .mock_all_auths() - .set_public_swap(deployer, &true); - comet_client.mock_all_auths().finalize(); comet_client.mock_all_auths().join_pool( &199_900_0000000, // finalize mints 100 diff --git a/comet.wasm b/comet.wasm old mode 100644 new mode 100755 index 82118f990f9b76665fd9ed71651046023d380473..e9493fd7536361d7142313a2e593d4eb9fbf51af GIT binary patch literal 29046 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 W@0_~z#?2qPab{-cjkoOF8T@}NH*s75 diff --git a/pool/src/dependencies/mod.rs b/pool/src/dependencies/mod.rs index 6c9f6d80..74dbbb86 100644 --- a/pool/src/dependencies/mod.rs +++ b/pool/src/dependencies/mod.rs @@ -1,4 +1,2 @@ mod backstop; -#[cfg(any(test, feature = "testutils"))] -pub use backstop::{BackstopDataKey, WASM as BACKSTOP_WASM}; pub use backstop::{Client as BackstopClient, PoolBackstopData}; diff --git a/pool/src/testutils.rs b/pool/src/testutils.rs index 9b9063c5..b887323f 100644 --- a/pool/src/testutils.rs +++ b/pool/src/testutils.rs @@ -143,21 +143,15 @@ pub(crate) fn create_comet_lp_pool<'a>( let usdc_client = MockTokenClient::new(e, usdc_token); blnd_client.mint(&admin, &1_000_0000000); usdc_client.mint(&admin, &25_0000000); - let exp_ledger = e.ledger().sequence() + 100; - blnd_client.approve(&admin, &contract_address, &2_000_0000000, &exp_ledger); - usdc_client.approve(&admin, &contract_address, &2_000_0000000, &exp_ledger); - client.init(&Address::generate(e), &admin); - client.bundle_bind( + client.init( + admin, &vec![e, blnd_token.clone(), usdc_token.clone()], + &vec![e, 0_8000000, 0_2000000], &vec![e, 1_000_0000000, 25_0000000], - &vec![e, 8_0000000, 2_0000000], + &0_0030000, ); - client.set_swap_fee(&0_0030000, &admin); - client.set_public_swap(&admin, &true); - client.finalize(); - (contract_address, client) } diff --git a/test-suites/src/liquidity_pool.rs b/test-suites/src/liquidity_pool.rs index 0afa5c88..3a0df37e 100644 --- a/test-suites/src/liquidity_pool.rs +++ b/test-suites/src/liquidity_pool.rs @@ -30,19 +30,14 @@ pub(crate) fn create_lp_pool<'a>( let token_2_client = MockTokenClient::new(e, token_2); token_1_client.mint(&admin, &1_000_0000000); token_2_client.mint(&admin, &25_0000000); - token_1_client.approve(&admin, &contract_address, &1_000_0000000, &5356700); - token_2_client.approve(&admin, &contract_address, &1_000_0000000, &5356700); - client.init(&Address::generate(e), &admin); - client.bundle_bind( + client.init( + admin, &vec![e, token_1.clone(), token_2.clone()], + &vec![e, 0_8000000, 0_2000000], &vec![e, 1_000_0000000, 25_0000000], - &vec![e, 8_0000000, 2_0000000], + &0_0030000, ); - client.set_swap_fee(&0_0030000, &admin); - client.set_public_swap(&admin, &true); - client.finalize(); - (contract_address, client) } diff --git a/test-suites/src/setup.rs b/test-suites/src/setup.rs index 6c62b0fb..c69d2c45 100644 --- a/test-suites/src/setup.rs +++ b/test-suites/src/setup.rs @@ -11,24 +11,18 @@ pub fn create_fixture_with_data<'a>(wasm: bool) -> TestFixture<'a> { let mut fixture = TestFixture::create(wasm); // mint whale tokens - let frodo = Address::generate(&fixture.env); - fixture.users.push(frodo.clone()); + let frodo = fixture.users[0].clone(); fixture.tokens[TokenIndex::STABLE].mint(&frodo, &(100_000 * 10i128.pow(6))); fixture.tokens[TokenIndex::XLM].mint(&frodo, &(1_000_000 * SCALAR_7)); fixture.tokens[TokenIndex::WETH].mint(&frodo, &(100 * 10i128.pow(9))); // mint LP tokens with whale - fixture.tokens[TokenIndex::BLND].mint(&frodo, &(500_0010_000_0000_0000 * SCALAR_7)); - // fixture.tokens[TokenIndex::BLND].approve(&frodo, &fixture.lp.address, &i128::MAX, &99999); - fixture.tokens[TokenIndex::USDC].mint(&frodo, &(12_5010_000_0000_0000 * SCALAR_7)); - // fixture.tokens[TokenIndex::USDC].approve(&frodo, &fixture.lp.address, &i128::MAX, &99999); + // frodo has 40m BLND from drop + fixture.tokens[TokenIndex::BLND].mint(&frodo, &(70_000_000 * SCALAR_7)); + fixture.tokens[TokenIndex::USDC].mint(&frodo, &(2_600_000 * SCALAR_7)); fixture.lp.join_pool( - &(500_000_0000 * SCALAR_7), - &svec![ - &fixture.env, - 500_0010_000_0000_0000 * SCALAR_7, - 12_5010_000_0000_0000 * SCALAR_7, - ], + &(10_000_000 * SCALAR_7), + &svec![&fixture.env, 110_000_000 * SCALAR_7, 2_600_000 * SCALAR_7,], &frodo, ); @@ -91,20 +85,6 @@ pub fn create_fixture_with_data<'a>(wasm: bool) -> TestFixture<'a> { fixture.jump(60); - // fixture.tokens[TokenIndex::STABLE].approve( - // &frodo, - // &pool_fixture.pool.address, - // &i128::MAX, - // &(fixture.env.ledger().sequence() + 100), - // ); - // fixture.tokens[TokenIndex::WETH].approve( - // &frodo, - // &pool_fixture.pool.address, - // &i128::MAX, - // &(fixture.env.ledger().sequence() + 100), - // ); - // fixture.tokens[TokenIndex::XLM].approve(&frodo, &pool_fixture.pool.address, &i128::MAX, &50000); - // supply and borrow STABLE for 80% utilization (close to target) let requests: SVec = svec![ &fixture.env, @@ -172,11 +152,15 @@ mod tests { let frodo = fixture.users.get(0).unwrap(); let pool_fixture: &PoolFixture = fixture.pools.get(0).unwrap(); - // validate backstop deposit + // validate backstop deposit and drop assert_eq!( 50_000 * SCALAR_7, fixture.lp.balance(&fixture.backstop.address) ); + assert_eq!( + 10_000_000 * SCALAR_7, + fixture.tokens[TokenIndex::BLND].balance(&fixture.bombadil) + ); // validate pool actions assert_eq!( @@ -224,11 +208,16 @@ mod tests { let fixture = create_fixture_with_data(false); let frodo = fixture.users.get(0).unwrap(); let pool_fixture: &PoolFixture = fixture.pools.get(0).unwrap(); + // validate backstop deposit assert_eq!( 50_000 * SCALAR_7, fixture.lp.balance(&fixture.backstop.address) ); + assert_eq!( + 10_000_000 * SCALAR_7, + fixture.tokens[TokenIndex::BLND].balance(&fixture.bombadil) + ); // validate pool actions assert_eq!( diff --git a/test-suites/tests/test_emitter.rs b/test-suites/tests/test_emitter.rs index 7b3e8cd4..5ddb90ee 100644 --- a/test-suites/tests/test_emitter.rs +++ b/test-suites/tests/test_emitter.rs @@ -18,24 +18,18 @@ use test_suites::{ fn test_emitter_no_reward_zone() { let mut fixture = TestFixture::create(false); // mint whale tokens - let frodo = Address::generate(&fixture.env); - fixture.users.push(frodo.clone()); + let frodo = fixture.users[0].clone(); fixture.tokens[TokenIndex::STABLE].mint(&frodo, &(100_000 * 10i128.pow(6))); fixture.tokens[TokenIndex::XLM].mint(&frodo, &(1_000_000 * SCALAR_7)); fixture.tokens[TokenIndex::WETH].mint(&frodo, &(100 * 10i128.pow(9))); // mint LP tokens with whale - fixture.tokens[TokenIndex::BLND].mint(&frodo, &(500_0010_000_0000_0000 * SCALAR_7)); - // fixture.tokens[TokenIndex::BLND].approve(&frodo, &fixture.lp.address, &i128::MAX, &99999); - fixture.tokens[TokenIndex::USDC].mint(&frodo, &(12_5010_000_0000_0000 * SCALAR_7)); - // fixture.tokens[TokenIndex::USDC].approve(&frodo, &fixture.lp.address, &i128::MAX, &99999); + // frodo has 40m BLND from drop + fixture.tokens[TokenIndex::BLND].mint(&frodo, &(70_000_000 * SCALAR_7)); + fixture.tokens[TokenIndex::USDC].mint(&frodo, &(2_600_000 * SCALAR_7)); fixture.lp.join_pool( - &(500_000_0000 * SCALAR_7), - &svec![ - &fixture.env, - 500_0010_000_0000_0000 * SCALAR_7, - 12_5010_000_0000_0000 * SCALAR_7, - ], + &(10_000_000 * SCALAR_7), + &svec![&fixture.env, 110_000_000 * SCALAR_7, 2_600_000 * SCALAR_7,], &frodo, ); diff --git a/test-suites/tests/test_wasm_happy_path.rs b/test-suites/tests/test_wasm_happy_path.rs index ad9fc1bc..f1d21203 100644 --- a/test-suites/tests/test_wasm_happy_path.rs +++ b/test-suites/tests/test_wasm_happy_path.rs @@ -391,7 +391,7 @@ fn test_wasm_happy_path() { &vec![&fixture.env, pool_fixture.pool.address.clone()], &frodo, ); - assert_eq!(claim_amount, 420798_0000000); + assert_eq!(claim_amount, 420797_9972539); backstop_blnd_balance -= claim_amount; assert_eq!( fixture.tokens[TokenIndex::BLND].balance(&fixture.backstop.address), @@ -433,8 +433,8 @@ fn test_wasm_happy_path() { &vec![&fixture.env, pool_fixture.pool.address.clone()], &frodo, ); - assert_eq!(claim_amount, 22014719_9998450); //actual amount is 22014720_0000000 but get's rounded down // 22014719_9998450 - backstop_blnd_balance -= 22014719_9998450; + assert_eq!(claim_amount, 22014719_9950114); //actual amount is 22014720_0000000 but get's rounded down + backstop_blnd_balance -= 22014719_9950114; assert_eq!( fixture.tokens[TokenIndex::BLND].balance(&fixture.backstop.address), backstop_blnd_balance From a6ab120b8980e1ff7db83becc1c076689c6c261b Mon Sep 17 00:00:00 2001 From: mootz12 Date: Wed, 1 May 2024 09:34:58 -0400 Subject: [PATCH 4/5] chore: add Stellar Expert WASM release workflow --- .github/workflows/release.yml | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..d880042b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +name: Stellar Expert WASM Release +on: + push: + tags: + - 'v*' # triggered whenever a new tag (previxed with "v") is pushed to the repository +jobs: + release-contract-backstop: + uses: stellar-expert/soroban-build-workflow/.github/workflows/release.yml@main + with: + release_name: ${{ github.ref_name }} + release_description: 'Blend Backstop Release' + package: 'backstop' + make_target: 'build' + secrets: + release_token: ${{ secrets.GITHUB_TOKEN }} + + release-contract-pool: + uses: stellar-expert/soroban-build-workflow/.github/workflows/release.yml@main + with: + release_name: ${{ github.ref_name }} + release_description: 'Blend Pool Release' + package: 'pool' + make_target: 'build' + secrets: + release_token: ${{ secrets.GITHUB_TOKEN }} + + release-contract-emitter: + uses: stellar-expert/soroban-build-workflow/.github/workflows/release.yml@main + with: + release_name: ${{ github.ref_name }} + release_description: 'Blend Emitter Release' + package: 'emitter' + secrets: + release_token: ${{ secrets.GITHUB_TOKEN }} + + release-contract-pool-factory: + uses: stellar-expert/soroban-build-workflow/.github/workflows/release.yml@main + with: + release_name: ${{ github.ref_name }} + release_description: 'Blend Pool Factory Release' + package: 'pool-factory' + make_target: 'build' + secrets: + release_token: ${{ secrets.GITHUB_TOKEN }} From 0af4dee74d187adbe4b792004a30f004dd87fac3 Mon Sep 17 00:00:00 2001 From: mootz12 Date: Wed, 1 May 2024 11:31:52 -0400 Subject: [PATCH 5/5] sdk: add stellar expert built wasms to rust sdk --- Cargo.lock | 2 +- blend-contract-sdk/Cargo.toml | 2 +- blend-contract-sdk/README.md | 21 ++++++--------------- blend-contract-sdk/src/testutils.rs | 4 ++-- blend-contract-sdk/wasm/backstop.wasm | Bin 27501 -> 27518 bytes blend-contract-sdk/wasm/comet.wasm | Bin 35006 -> 29046 bytes blend-contract-sdk/wasm/comet_factory.wasm | Bin 3486 -> 2502 bytes blend-contract-sdk/wasm/emitter.wasm | Bin 10287 -> 10448 bytes blend-contract-sdk/wasm/pool.wasm | Bin 49912 -> 49912 bytes blend-contract-sdk/wasm/pool_factory.wasm | Bin 2898 -> 2898 bytes 10 files changed, 10 insertions(+), 19 deletions(-) mode change 100644 => 100755 blend-contract-sdk/wasm/backstop.wasm mode change 100644 => 100755 blend-contract-sdk/wasm/comet.wasm mode change 100644 => 100755 blend-contract-sdk/wasm/comet_factory.wasm mode change 100644 => 100755 blend-contract-sdk/wasm/emitter.wasm mode change 100644 => 100755 blend-contract-sdk/wasm/pool.wasm mode change 100644 => 100755 blend-contract-sdk/wasm/pool_factory.wasm diff --git a/Cargo.lock b/Cargo.lock index 3d3bff95..5eaed891 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,7 +106,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "blend-contract-sdk" -version = "0.2.0" +version = "1.0.0" dependencies = [ "soroban-sdk", ] diff --git a/blend-contract-sdk/Cargo.toml b/blend-contract-sdk/Cargo.toml index 79e65847..4e803dbb 100644 --- a/blend-contract-sdk/Cargo.toml +++ b/blend-contract-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blend-contract-sdk" -version = "0.2.0" +version = "1.0.0" description = "Traits, clients, types, and WASMs for the Blend Protocol for use in Soroban contract development." homepage = "https://github.com/blend-capital/blend-contracts" repository = "https://github.com/blend-capital/blend-contracts" diff --git a/blend-contract-sdk/README.md b/blend-contract-sdk/README.md index 94389111..280abcb7 100644 --- a/blend-contract-sdk/README.md +++ b/blend-contract-sdk/README.md @@ -66,21 +66,12 @@ pool_client.mock_all_auths().update_status(); // update status based on backstop ## WASM Verification -The WASM files included will align with the GitHub release the SDK was published with (the version numbers will match). The WASM files were generated with the Makefile. +The WASM files included will align with the GitHub release the SDK was published with (the version numbers will match). -Since WASM builds can vary based on factors like OS, here are the details of the machine that built the WASMs included in this package: - -* Ubuntu 22.04.4 LTS -* stable-x86_64-unknown-linux-gnu (default) -* rustc 1.77.1 (7cf61ebde 2024-03-27) -* soroban 20.3.1 (ae5446f63ca8a275e61912019199254d598f3bd5) -* soroban-env 20.2.1 (18a10592853d9edf4e341b565b0b1638f95f0393) -* soroban-env interface version 85899345920 -* stellar-xdr 20.1.0 (8b9d623ef40423a8462442b86997155f2c04d3a1) -* xdr curr (b96148cd4acc372cc9af17b909ffe4b12c43ecb6) +The WASMs are generated with the [Stellar Expert WASM Release Action](https://github.com/stellar-expert/soroban-build-workflow) The SHA256 Checksums: -* backstop - `8dfbc6ba300cde6ebe747cf985cf9221bf3594981595b9c26bbd108ff19a5598` -* emitter - `b1555702a4cca7c44e02beb5aa82b0271c0367471c68f2ec9246c31b202e38ee` -* pool_factory - `8bc7894d8a4e46b085d0579e233e3c436bb34e18f9a2a83d4bde8526cde18cb6` -* pool - `76ebcea354d5959c5b0d38818ddf1524c5af16970231b532f5caa63121930861` \ No newline at end of file +* backstop - `62f61b32fff99f7eec052a8e573c367759f161c481a5caf0e76a10ae4617c3b4` +* emitter - `438a5528cff17ede6fe515f095c43c5f15727af17d006971485e52462e7e7b89` +* pool_factory - `0287f4ad7350935b83d94e046c0bcabc960b233dbce1531008c021b71d406a1d` +* pool - `46b4c2d5fcac623d9668b19d0ce68f9da5a18029f3dffa8afded436ab16e8883` \ No newline at end of file diff --git a/blend-contract-sdk/src/testutils.rs b/blend-contract-sdk/src/testutils.rs index 01b62d73..756d8b94 100644 --- a/blend-contract-sdk/src/testutils.rs +++ b/blend-contract-sdk/src/testutils.rs @@ -1,4 +1,4 @@ -use soroban_sdk::{token::StellarAssetClient, vec, Address, Env, Map}; +use soroban_sdk::{token::StellarAssetClient, vec, Address, Env, Vec}; use crate::{backstop, emitter, pool, pool_factory}; @@ -93,7 +93,7 @@ impl<'a> BlendFixture<'a> { &usdc, &blnd, &pool_factory, - &Map::new(env), + &Vec::new(env), ); let pool_hash = env.deployer().upload_contract_wasm(pool::WASM); diff --git a/blend-contract-sdk/wasm/backstop.wasm b/blend-contract-sdk/wasm/backstop.wasm old mode 100644 new mode 100755 index 8b0bd59fbcf5e780ecbc07a703811405c178fc5d..acf4b9e0478cdfd22339382b908c8cd3c7ef6a6b GIT binary patch delta 4158 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 WeP!n{h5mi|!Nm8yNayN-#{UAV_P^r* diff --git a/blend-contract-sdk/wasm/comet.wasm b/blend-contract-sdk/wasm/comet.wasm old mode 100644 new mode 100755 index 82118f990f9b76665fd9ed71651046023d380473..e9493fd7536361d7142313a2e593d4eb9fbf51af GIT binary patch literal 29046 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 W@0_~z#?2qPab{-cjkoOF8T@}NH*s75 diff --git a/blend-contract-sdk/wasm/comet_factory.wasm b/blend-contract-sdk/wasm/comet_factory.wasm old mode 100644 new mode 100755 index 3a73646badb12fa937a8374bc13e46241c7320cb..9db8020a75832879ce60472bcf1bf129d4c6cf62 GIT binary patch literal 2502 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 UbEZ+BovECgNs`9Q*+zr@1Ia*T4*&oF diff --git a/blend-contract-sdk/wasm/emitter.wasm b/blend-contract-sdk/wasm/emitter.wasm old mode 100644 new mode 100755 index 68bed72294b20e5d6067dd578f4f41f682f8b69d..c6f00d0e3465362f801dca34a43f38aa1f3f6cf6 GIT binary patch delta 1416 zcmb7DO>7%Q6n<}J_Q&4ccoNc5?AV@Nr=k&QNnF}cgi`N@q`5VYL=kYnu0Rl{Y1CA* zsw#L5O#=st6b%>dNL+|2Yc8Z9JaJ1bH!yYU9hKFHtO#oJ!?MLe680 zWE)>eGdu=@a!wF(1y7LA1@g@D<5e`RW2WPJ+(tVm9ecnO=!(INuq-cQSYiML7ee5W z2@fzTHUoMJKgT(Ztm4$3nkmi}&t$)QqN*QdJ4YEfOUU91gmO7xqrf@}7G^~){Pwk5 z5L&YAq7&Xp^sFrFvhdN@p}38M`VTf!_7#S*H44r_P_P}T%}8u0+*72d8~gxPbeqR| z+=#KPKQNv#eCf*5J=;8pSkh&yS}G}&4@M|?KB6qLBp-4dIy$`Dy#;b!uUc0*#ps`{ zvpC;-(!PVJ^k8aNWJOX5%_}Dc#@JUdr|CVSG<2yGIj#v@1sKS8Lv?Z@(iU$szk9? z#HKi;W%-Pr!cj(Qk<*Gg%#OZHI1+NGrErW(c{*7REhHp(v`Zsb_p)wgf4Ar%?T8mw zX4H+lH}r2`{|e`*5O`XNg@PyKBfj{n0E6goWjyEc{Z>+DA?OFuS zo}hc~$11}Y$@RLX(|_U!>1laB+(}wr$itEvN!oczKB0LoC^0%K`I5%p@Azn=+wCej zl-J|Ax-~$Tj54P;a!q9V``k9kcjVj1dX>Rhq-AO7GnAo+l)*@NA7Snw)8X*gzrm}+ zH4ODf!y)CkH~bzs(5Y#ZnMU@@<{Jg`7J(a(k>ZD)1vuL&zaSW?U&Xr kFRfmjU0YjSgPXnIgJqWa5rF?f?yPtI@Fv5mzWeappJsgvt^fc4 delta 1323 zcmZWoPiP!f82`Ta-u&5lJIUL$O>5HZzL|}Z(5TsHOez|8rY03HO^R03L$i{o+0Aw} z32l*OC$+YSTBW>;;!T7eBzV}P2ZJYt7D6c~f@c-H2zu~P;y05Nq`u+(zHh#NzxRFf zW@q8+`7+ejn+O27dSHA|~lh-3e);LyH6jQ55?S z5911+1tc6NT*V47!n0rzPLtlm8hE5nWcqQkU(8}^S$q>8qpT)QX5J?Vm$KaR_y#O7 zDmtB&p2{$FzlL?fi}*MQDmtF&lNs?8czmLQwqwgYy1k0IAYI=Um=}edaGai;

`I z6GEU3eVhi6>oHH`4>)TaR+i74i08_4&w96ySIi{aF`dNj-lT{HB2PGaOQScLXGG~m>ULGO&<;ME?$mr!f7AW!|IXHRk?vZ zSB%pTd+VeIch~SHKTK*+@1HC%)2s%fNK$NZeBBg|M(}I(HO&v z8s`Unp^gRiJz|H5ai5r{q|PfoeH)sy3`8dPSd)9SR5R`P7IkdjM?6awTZ{A*N_(Rm z)EKdD(o$_A;W4%Yo(Bn1W9ARpl{mRVFJeEd9f~ts^v>FC@?DPMW$MmKOH8LVto<6A z1xOc6=54t*a=>LuX9IRs1Jb5Uh8tp@0Qb776q*->B z)gABu)gs@KqYH%fqj!0f7iOkdF`p03U}SzCsu4a_e3$UsV&X@Vu4T1Be;os9mP^rC zZDV7(`PPQsXzAM0lD@FA@uqH_UtW8CwRJ(j-a--s)h3U-za5e%TIVQ# feWi77c5SV-1~US diff --git a/blend-contract-sdk/wasm/pool.wasm b/blend-contract-sdk/wasm/pool.wasm old mode 100644 new mode 100755 index c10913a8449e84c49e8b99f52e3d8289d659f97e..d0d28ea82e0bf3b204f858ec588cd6275cf7fb31 GIT binary patch delta 1987 zcmZuyYiv|S6uxt3cf0N0Wp9@j=nH21+|tKxp9=z(y9NrSLW2a+VrYSCxusT6NFyRk zVQVSzM;%3!LR)AXFrbxdL?V%j!8E}TL}D7_1B`}(k%u9nh-v(0w+*%N&zZUB@y&P6 znKO4dNQZ;8FHUwwITCFaHQEuQSe55C|Y+!*2a6ce%|MbcPZGEJ2j4b{wpRq|04 z3q{F%bQ+_Ys%x_9(LJ%y%dB3|QuS1c4_Lp8_WGz59RLO( zg_>tXeM!3cji>_1B%2?y%Jv8G@N%Vsc#MNe2EoU9`%%ajCv6~JJ~-(F_RS8Rc#XS` zI2j){XEMph=#;?c4F&|HpPgnh!4rKFeZkR8V9Df1{P z;`ifL#uWI8D#tTf3!J$jX@P+eNli1V&J+v$mr zN=6E#HzNVEJR=#hA!8ooiH!G9f>O5^`$l&qs9$k!0qL^L#U!?uFtgT4bX3yh51jbb z#03`I{M;@p{L~NxgP(iU zt*x|jj4OS_)fg#l7HI_+p9ZaxvNIyBf0q1>kNf3!#K+LmVHDxovQ86P(6quOqc`0v zTak+A>07W&U-b(ism91N_lT0F@m&}co4Pg`}AQE!#mk)??_e6-(!6*kpJ2e8%pE#WcQxwZqLu62`VOmMtICU`!zZa6js zAD|)pAz5d3rm7xZwLS@yUSEHwAY>n=E)^$Sr8;vkB}4$Hju9B56L7m~c13!b#3r$5 zHJ9f+e=UqMKwSz@`hYT)hVlsIvk54M_CgE^)9aH%f%`$vA@b*XE$A67wGE<3!y68d zW^J(^acthMJ2LKT{>F;{a@1$ZP+FLknbch4iH5HUDKw%sps#g{)V(z&xsXX(Kc>*m zB2hQ|1_p?##6#IPrZnoe{w6NQ^2RsB;Q#PyJwg|4o0B8nLbPm7ARF@ACx4Zr_Dvngoz>J+dxA0$Kp#Z4> delta 2024 zcmZuyeN0tl7(efM@4Z|&2k+quDqs0tK)8s&WlB?HU6kfg^N_rWkRv?amYsfx zd_X!#u!FRbxC7_p2vH>_g$N@|)~4`!+vG{979+Gfj9>2qd-T%L;^2F1l{<==luMo3 zbVhRNB-N=fqBBFkzOPTxW3|G}O#dsx`0 z$^tY@483*Oc2rg^L?xC_;qS3Kp6{q7Q}_YL8q&odI!Zx~sp7eD=g4t>E3OzcT?v6!E5DNfuTqzgfO%NWA^5lue**O7 zaT|!AUmMqhd$Y?Re)FCyS;mLr&LAbc!2KC4esh0Gkk!e=r${>=Nc57!JRzwMoGVH5 zaZjDFh;(xUwB0;Cp_Gzh{vdgIqAx@=Ifco3`0Oo75BCpAT9#Rpa@B!&0-lAW%WU$j zmvIba4hWCmWT%7vnVklz=468Ua#BI7axy?S=9Gf=qfhOlI2HlXi67+&~PntFlv9Fr;G|A>4 zPOAZ+n!l73n5*;MGRZPG7fvJN15C-K%wuPY?lhte;2--KDKxM6QVF!~6xng``~D@! zW^Qq#DDM~3eeS|&1(5uiLOp!mr)9le(hk{?lJ`*6V8CU!7h}Yx^M$i!!gFNSDX{&s z-4tMR%M2j*mMxE&8DMfQt@YSYN<4ZoWpJ*~FmkD+S+W&~O~%X!(GrNRNl_Uut4M*n z=POdvEIqHs2|dk%V9@gptF>0F9Ep`aj@2BhXclQj7Mw;{WtC?|TK_Ek8y^pL0JwU_cgc*_J;1nz1BDUbDV;Ct5nu zYU#}_&tfJ!0^`f4u>w^S8~) z7mE!oyGEj$tvX1rp1^NlRhZK~Vb1lGwNKjD40 zgjW+%zz23_fGSN940LPLBT>4ycE1ag%*bWj??*0)!swS}Lo47Ho1cK%?dI)5t+qw1 z^ouQ@f`<2=1*df1C9hcFma>Qhfd%9fGEOYu4sl{7ACxiA1!nR7h{HV7x*!gvv$s8I z&Tgx=aiy~r^*r2}op78m2mS>a2}x)G)sFM4oqCju;iTZkG6HV)(I6~dIQkcF>)2>6 OIaV{76!A~a&-)ilxC}i2 diff --git a/blend-contract-sdk/wasm/pool_factory.wasm b/blend-contract-sdk/wasm/pool_factory.wasm old mode 100644 new mode 100755 index 553a632cb785bffa83982042a1ad9616547a74f4..cc662d3dc8e54ccebbd00aedd32cf753679895ca GIT binary patch delta 13 Ucmca4c1dglH#eivWFBre03bpGx&QzG delta 13 Ucmca4c1dglH#ei