From 27ee3155ee5fc522495dfe43dfea65d9bc8755d5 Mon Sep 17 00:00:00 2001 From: mootz12 Date: Tue, 30 Apr 2024 18:01:39 -0400 Subject: [PATCH] chore: add new comet wasm with 256 bit math --- backstop/src/emissions/claim.rs | 54 +++++++++++----------- backstop/src/testutils.rs | 14 ++---- comet.wasm | Bin 35006 -> 29046 bytes pool/src/testutils.rs | 14 ++---- test-suites/src/liquidity_pool.rs | 13 ++---- test-suites/tests/test_wasm_happy_path.rs | 6 +-- 6 files changed, 42 insertions(+), 59 deletions(-) mode change 100644 => 100755 comet.wasm 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/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/testutils.rs b/pool/src/testutils.rs index 86d4e63f..057bc181 100644 --- a/pool/src/testutils.rs +++ b/pool/src/testutils.rs @@ -145,21 +145,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/tests/test_wasm_happy_path.rs b/test-suites/tests/test_wasm_happy_path.rs index ad9fc1bc..cfc777ee 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_9966204); 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_9894996); //actual amount is 22014720_0000000 but get's rounded down + backstop_blnd_balance -= 22014719_9894996; assert_eq!( fixture.tokens[TokenIndex::BLND].balance(&fixture.backstop.address), backstop_blnd_balance