From d41ef54759f3acb494e94b86e32ad0ddf3dc3bc9 Mon Sep 17 00:00:00 2001 From: Maksym Khomiak Date: Fri, 24 Jul 2026 09:31:27 +0000 Subject: [PATCH 1/4] fix: make liquidation criterion account for 'min_collateral_value_cents'; add 'Obligation' to 'ClaimCoverBadDebtResults' event --- contracts/market/src/contract.rs | 7 ++ contracts/market/src/events.rs | 9 +- contracts/market/src/obligation.rs | 23 +++++- contracts/market/src/processors.rs | 4 +- tests/src/liquidate.rs | 78 +++++++++++++++++- wasms/deploy/aggregated_oracle.wasm | Bin 18280 -> 18280 bytes wasms/deploy/aqua_swap_provider.wasm | Bin 5337 -> 5337 bytes wasms/deploy/controlled_insurance_fund.wasm | Bin 9342 -> 9342 bytes wasms/deploy/farms.wasm | Bin 49102 -> 49102 bytes wasms/deploy/market.wasm | Bin 110872 -> 111237 bytes wasms/deploy/redstone_sep_40_adapter.wasm | Bin 10797 -> 10797 bytes .../aggregated_oracle.optimized.wasm | Bin 18280 -> 18280 bytes .../aqua_swap_provider.optimized.wasm | Bin 5337 -> 5337 bytes .../controlled_insurance_fund.optimized.wasm | Bin 9342 -> 9342 bytes wasms/deploy_optimized/farms.optimized.wasm | Bin 49114 -> 49114 bytes wasms/deploy_optimized/market.optimized.wasm | Bin 110876 -> 111241 bytes .../redstone_sep_40_adapter.optimized.wasm | Bin 10797 -> 10797 bytes wasms/market.wasm | Bin 110872 -> 111463 bytes 18 files changed, 113 insertions(+), 8 deletions(-) diff --git a/contracts/market/src/contract.rs b/contracts/market/src/contract.rs index 69591de1..6760d400 100644 --- a/contracts/market/src/contract.rs +++ b/contracts/market/src/contract.rs @@ -1002,6 +1002,13 @@ impl MarketContract { Ok(()) } + /// Updates market's oracle contract (this is a stage market) + pub fn stage_update_oracle(e: Env, new_oracle: Address) { + require_admin(&e); + + storage::set_oracle(&e, &new_oracle); + } + // Updates pool's status // // # Arguments diff --git a/contracts/market/src/events.rs b/contracts/market/src/events.rs index e6264011..87d65b8f 100644 --- a/contracts/market/src/events.rs +++ b/contracts/market/src/events.rs @@ -210,6 +210,7 @@ struct IssueCoverBadDebt { struct ClaimCoverBadDebtResults { #[topic] obligation_key: ObligationKey, + obligation: Option, } #[contractevent] @@ -725,8 +726,12 @@ pub fn issue_cover_bad_debt(e: &Env, obligation_key: ObligationKey) { IssueCoverBadDebt { obligation_key }.publish(e); } -pub fn claim_cover_bad_debt_results(e: &Env, obligation_key: ObligationKey) { - ClaimCoverBadDebtResults { obligation_key }.publish(e); +pub fn claim_cover_bad_debt_results( + e: &Env, + obligation_key: ObligationKey, + obligation: Option, +) { + ClaimCoverBadDebtResults { obligation_key, obligation }.publish(e); } pub fn bad_debt_request_cancelled(e: &Env, pool_address: &Address, request_id: u64, missing: bool) { diff --git a/contracts/market/src/obligation.rs b/contracts/market/src/obligation.rs index 828129ff..99d87d88 100644 --- a/contracts/market/src/obligation.rs +++ b/contracts/market/src/obligation.rs @@ -378,8 +378,12 @@ impl Obligation { // Computes the current collateral assets summed value(deposit shares + plain collateral) per // obligation, scaling each value with the appropriate `close_ltv_bps` value - fn compute_collateral_value_scaled_w_close_ltvs(&self, e: &Env) -> Result { + fn compute_collateral_value_scaled_w_close_ltvs( + &self, + e: &Env, + ) -> Result<(i128, u32), MCError> { let mut value_sum = 0_i128; + let mut positions_with_non_zero_close_ltv_count = 0u32; for (pool_address, deposit_position) in self.deposits.iter() { let pool = Pool::try_get(e, &pool_address).map_err(|_| { @@ -388,6 +392,9 @@ impl Obligation { MCError::InternalError })?; + if pool.config.health_config.close_ltv_bps.is_positive() { + positions_with_non_zero_close_ltv_count += 1; + } let new_value_term = Self::compute_pool_collateral_value_scaled( e, &pool, @@ -398,7 +405,7 @@ impl Obligation { value_sum = value_sum.checked_add(new_value_term).map_over_or_underflow()?; } - Ok(value_sum) + Ok((value_sum, positions_with_non_zero_close_ltv_count)) } // Computes the current collateral assets summed value(deposit shares + plain collateral) per @@ -927,10 +934,20 @@ impl Obligation { .ok_or(MCError::BorrowPositionDoesNotExist)?, ); - let (obligation_debt_value_w_liability_factors, obligation_collateral_value_w_close_ltvs) = ( + let ( + obligation_debt_value_w_liability_factors, + (obligation_collateral_value_w_close_ltvs, positions_with_non_zero_close_ltv_count), + ) = ( self.compute_debt_value_scaled_w_liability_factors(e)?, self.compute_collateral_value_scaled_w_close_ltvs(e)?, ); + + let min_collateral_value_requirement = compute_min_collateral_threshold_scaled(e)? + .checked_mul(positions_with_non_zero_close_ltv_count as i128) + .map_over_or_underflow()?; + let obligation_collateral_value_w_close_ltvs = obligation_collateral_value_w_close_ltvs + .saturating_sub(min_collateral_value_requirement); + if obligation_debt_value_w_liability_factors <= obligation_collateral_value_w_close_ltvs { return Err(MCError::ObligationIsHealthy); } diff --git a/contracts/market/src/processors.rs b/contracts/market/src/processors.rs index bf2a0d63..4bda6eb8 100644 --- a/contracts/market/src/processors.rs +++ b/contracts/market/src/processors.rs @@ -1064,12 +1064,12 @@ pub fn process_claim_cover_bad_debt_results( if obligation.is_empty() { obligation.remove(e, &obligation_key); + events::claim_cover_bad_debt_results(e, obligation_key, None); } else { obligation.set(e, &obligation_key); + events::claim_cover_bad_debt_results(e, obligation_key, Some(obligation)); } - events::claim_cover_bad_debt_results(e, obligation_key); - Ok(()) } diff --git a/tests/src/liquidate.rs b/tests/src/liquidate.rs index 08c31d74..8e9de477 100644 --- a/tests/src/liquidate.rs +++ b/tests/src/liquidate.rs @@ -1,7 +1,7 @@ #![cfg(test)] use market::{ - constants::{BPS_FACTOR, DEFAULT_BAD_DEBT_LOCK_D}, + constants::{BPS_FACTOR, DEFAULT_BAD_DEBT_LOCK_D, DEFAULT_MAX_POSITIONS}, error::MCError, obligation::ObligationKey, }; @@ -172,6 +172,21 @@ impl LiquidationTest { self.fixture.contract_client.refresh_pool(&self.collateral_pool_address); } + fn set_min_collateral_value_cents(&self, cents: i128) { + let update_in_queue_period = + self.fixture.contract_client.get_global_state().update_in_queue_period; + + self.fixture.contract_client.queue_in_market_update( + &DEFAULT_MAX_POSITIONS, + ¢s, + &DEFAULT_BAD_DEBT_LOCK_D, + ); + self.fixture.e.ledger().with_mut(|li| li.timestamp += update_in_queue_period); + self.fixture.contract_client.refresh_pool(&self.borrow_pool_address); + self.fixture.contract_client.refresh_pool(&self.collateral_pool_address); + self.fixture.contract_client.apply_market_update(); + } + fn ltv(&self) -> i128 { compute_unparameterized_ltv_bps( &self.fixture.e, @@ -853,3 +868,64 @@ fn test_liquidate_with_excess_repay_amount_refunds_difference() { Err(MCError::ObligationDoesNotExist) ); } + +#[test] +fn test_liquidate_below_min_collateral_while_close_ltv_solvent() { + let test = LiquidationTest::new(); + test.set_min_collateral_value_cents(100); + + let debt_before = test.debt(); + + let result = test.fixture.contract_client.try_liquidate( + &test.liquidator, + &ObligationKey::new(test.borrower.clone()), + &test.borrow_pool_address, + &test.collateral_pool_address, + &test.max_liquidation_amount(), + &0, + ); + + assert!( + result.is_ok(), + "Position below min_collateral_value_cents must be liquidatable even when close-LTV \ + solvent, got: {result:?}" + ); + assert!(test.debt() < debt_before, "Debt should be reduced by the liquidation"); +} + +#[test] +fn test_below_min_collateral_liquidation_not_rejected_as_healthy() { + let test = LiquidationTest::new(); + test.set_min_collateral_value_cents(100); + + let result = test.fixture.contract_client.try_liquidate( + &test.liquidator, + &ObligationKey::new(test.borrower.clone()), + &test.borrow_pool_address, + &test.collateral_pool_address, + &1, + &0, + ); + + assert_ne!( + result, + Err(Ok(MCError::ObligationIsHealthy)), + "Sub-minimum collateral positions must not be treated as healthy" + ); +} + +#[test] +fn test_healthy_position_above_min_collateral_still_healthy() { + let test = LiquidationTest::new(); + + let result = test.fixture.contract_client.try_liquidate( + &test.liquidator, + &ObligationKey::new(test.borrower.clone()), + &test.borrow_pool_address, + &test.collateral_pool_address, + &1, + &0, + ); + + assert_eq!(result, Err(Ok(MCError::ObligationIsHealthy))); +} diff --git a/wasms/deploy/aggregated_oracle.wasm b/wasms/deploy/aggregated_oracle.wasm index 17afc872c2e03fa5a230813050028bc16bedba98..4ba3d58b864a22dd143b4c377b32b190a4b6d0c4 100644 GIT binary patch delta 714 zcmYMxKWGzC90&0Cd+&00>D}cX#`a7s=65zNR;bV^v`LPKOfO^kS|~p|;Uuqi(Ktp(Ud~ zjh1sAmkPEFpBlDvwh9$Se;ajj6@_x6e~d=C(n7P95M=6uas7yVK6fzg(#|H}>95tr z?2|n#>0xkm=_bH%k30m&U{WCG;fAslO{}JTq?kuvyFEa`%8N*R;b`~^jb?^F0B=uy6M)%;T+vWIZ<&D zitq*pE$AR!53;z3Zi0fYE_$2XCJt^Q{@%4QQxZPk{QkT*Ie^IljGjO+=Lf=<(g~%A zi)YYqh8xJwa~9T-BVQGs+6+7&xqkcLJ=38&QLj?h>PM@mOLZ%iR=->IN|lw?tp2cC zFLhX}*s=W6vMkxDR9O9O)h$(2%B}vf8kb57O;;`r8!@G zkbAW=R{@4gOyjLZ(P1dG8X%)c&wLKp%JDHZf3TP=XYA|u| zGAaO}CbNJ!Glv3$Bcp)!=Fd#2Op{lz>Q0Vi_1}Dj^%Aq7rXsrnivo)#vjT|F5YU{w zowI>ad$I-B21f18FS%S8fl7EFN(4YkB!Eincxr%>yLkke7&RxKf3TP@YYA|u| zGAaO}CbNJ!Glv3$Bcp)U=Fd#2Op{w!113kX>TbTudXZUBTajIXMS(?=Sph_72xw2< z&e_1IHQ9n|1EbdFms~E4KqWj7B?2HN5(TPcbQEIai zTNEp!`s7;f_l&BWb9q{r7}Yj^;`3)_RGaK1vg4^xt&HlMT}3Pf0ADN^ AGynhq diff --git a/wasms/deploy/farms.wasm b/wasms/deploy/farms.wasm index 84969750120a1ff5df0bf9988ab6aa1688822991..4134809f26e535e5943eb7814896b008d783f19d 100644 GIT binary patch delta 114 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 C9s<|^ delta 13273 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 Np*ihWY-J(;{{rf-xIX{@ diff --git a/wasms/deploy/redstone_sep_40_adapter.wasm b/wasms/deploy/redstone_sep_40_adapter.wasm index c0423f550432ed120557aae97b6a79acac47b75e..7702a33062379cc823b64e2bebe4e9c0d94089cc 100644 GIT binary patch delta 441 zcmYk$u}T9$5C-6#*}L7nyER#&At@|YP)RyLh?f+Bv#}2mK@cr{0SgOrv9c1B0Sn(D zg4_#O*s56CrnIrK3L@UB=h+Mc-w*#k8BT^5TMwwvf#!ix%5lnGG!?i^;?IjwRassw`DFeQ_ETDoXX8 zPMxYk{Zc)ruTH~4551DP<9ElRU|uRZojLUi%_o14wqRln&Oe?14TFD9Ct|EMv&@2p zO*E_YA)2%#FQHAD+=UiZ)EYgiZRpW*5a)LCjVHhnPlUksumCHycJVKrcJj_hF@#+_+f9^er=8+HYLvGHa~Yz5tX)P*?x} delta 460 zcmYk$F-rq66bJCUm%Ai)7u!&+6>$g@rMC$}dloFTi+iaEE;{-J931Rb5S;`uPJV|9 za$mr~wTPo@!NtYJse_oP=Skp^_kIuFe>@luuC^mgQy3o5G)>8UU%_g{N5(nz=Na`m zBax)x0>P+C5D_RP1Q29)0c9^uG&YdT35^&U~lr*BTfTo1j1spAjFEN5CMI-NQ7a_EPi! diff --git a/wasms/deploy_optimized/aggregated_oracle.optimized.wasm b/wasms/deploy_optimized/aggregated_oracle.optimized.wasm index 17afc872c2e03fa5a230813050028bc16bedba98..4ba3d58b864a22dd143b4c377b32b190a4b6d0c4 100644 GIT binary patch delta 714 zcmYMxKWGzC90&0Cd+&00>D}cX#`a7s=65zNR;bV^v`LPKOfO^kS|~p|;Uuqi(Ktp(Ud~ zjh1sAmkPEFpBlDvwh9$Se;ajj6@_x6e~d=C(n7P95M=6uas7yVK6fzg(#|H}>95tr z?2|n#>0xkm=_bH%k30m&U{WCG;fAslO{}JTq?kuvyFEa`%8N*R;b`~^jb?^F0B=uy6M)%;T+vWIZ<&D zitq*pE$AR!53;z3Zi0fYE_$2XCJt^Q{@%4QQxZPk{QkT*Ie^IljGjO+=Lf=<(g~%A zi)YYqh8xJwa~9T-BVQGs+6+7&xqkcLJ=38&QLj?h>PM@mOLZ%iR=->IN|lw?tp2cC zFLhX}*s=W6vMkxDR9O9O)h$(2%B}vf8kb57O;;`r8!@G zkbAW=R{@4gOyjLZ(P1dG8X%)c&wLKp%JDHZf3TP=XYA|u| zGAaO}CbNJ!Glv3$Bcp)!=Fd#2Op{lz>Q0Vi_1}Dj^%Aq7rXsrnivo)#vjT|F5YU{w zowI>ad$I-B21f18FS%S8fl7EFN(4YkB!Eincxr%>yLkke7&RxKf3TP@YYA|u| zGAaO}CbNJ!Glv3$Bcp)U=Fd#2Op{w!113kX>TbTudXZUBTajIXMS(?=Sph_72xw2< z&e_1IHQ9n|1EbdFms~E4KqWj7B?2HN5(TPcbQEIai zTNEp!`s7;f_l&BWb9q{r7}Yj^;`3)_RGaK1vg4^xt&HlMT}3Pf0ADN^ AGynhq diff --git a/wasms/deploy_optimized/farms.optimized.wasm b/wasms/deploy_optimized/farms.optimized.wasm index 8b8df8455b2ae170e6eb118e11b7991b864c5cf5..887869a566952dac3fa891a77bfd01e2aaa93584 100644 GIT binary patch delta 114 zcmcchpXt_rrVT7iEUat{Y@0cl=CLp)Y+lZG(O|NoWx!@`3o*vY73PyS7g`F50VP`e z*;pBqH+P5VF#)MvVTB+{CsLLjNO>i6FaxQ}$=^VNr_$U&Dg|?Xg5Cw~J8o=S5AsT9ol36kS3VF$?xmml{4 E0Ob@XBLDyZ diff --git a/wasms/deploy_optimized/market.optimized.wasm b/wasms/deploy_optimized/market.optimized.wasm index b354214bd2a222b3456f96b80002224ee480742a..991894e5965bd8d3d2a06f74677fdf2c9d78a28e 100644 GIT binary patch delta 13728 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 U-Tlwq$HueJjNQNA%0mAC1Nz*%JOBUy diff --git a/wasms/deploy_optimized/redstone_sep_40_adapter.optimized.wasm b/wasms/deploy_optimized/redstone_sep_40_adapter.optimized.wasm index c0423f550432ed120557aae97b6a79acac47b75e..7702a33062379cc823b64e2bebe4e9c0d94089cc 100644 GIT binary patch delta 441 zcmYk$u}T9$5C-6#*}L7nyER#&At@|YP)RyLh?f+Bv#}2mK@cr{0SgOrv9c1B0Sn(D zg4_#O*s56CrnIrK3L@UB=h+Mc-w*#k8BT^5TMwwvf#!ix%5lnGG!?i^;?IjwRassw`DFeQ_ETDoXX8 zPMxYk{Zc)ruTH~4551DP<9ElRU|uRZojLUi%_o14wqRln&Oe?14TFD9Ct|EMv&@2p zO*E_YA)2%#FQHAD+=UiZ)EYgiZRpW*5a)LCjVHhnPlUksumCHycJVKrcJj_hF@#+_+f9^er=8+HYLvGHa~Yz5tX)P*?x} delta 460 zcmYk$F-rq66bJCUm%Ai)7u!&+6>$g@rMC$}dloFTi+iaEE;{-J931Rb5S;`uPJV|9 za$mr~wTPo@!NtYJse_oP=Skp^_kIuFe>@luuC^mgQy3o5G)>8UU%_g{N5(nz=Na`m zBax)x0>P+C5D_RP1Q29)0c9^uG&YdT35^&U~lr*BTfTo1j1spAjFEN5CMI-NQ7a_EPi! diff --git a/wasms/market.wasm b/wasms/market.wasm index fbac7a66064885abe6fd51761f72e61bbce00863..8669c432108f1df188aa6776ab8b4302042c0321 100644 GIT binary patch delta 10575 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 From 6cf00428883f7728a99cd28e11f3157786572c9a Mon Sep 17 00:00:00 2001 From: Maksym Khomiak Date: Fri, 24 Jul 2026 10:17:29 +0000 Subject: [PATCH 2/4] chore: add tests; remove unnecessaries --- contracts/market/src/contract.rs | 7 -- contracts/market/src/obligation.rs | 3 +- tests/src/liquidate.rs | 106 +++++++++++++++++++ wasms/deploy/market.wasm | Bin 111237 -> 111271 bytes wasms/deploy_optimized/market.optimized.wasm | Bin 111241 -> 111275 bytes wasms/market.wasm | Bin 111463 -> 111271 bytes 6 files changed, 108 insertions(+), 8 deletions(-) diff --git a/contracts/market/src/contract.rs b/contracts/market/src/contract.rs index 6760d400..69591de1 100644 --- a/contracts/market/src/contract.rs +++ b/contracts/market/src/contract.rs @@ -1002,13 +1002,6 @@ impl MarketContract { Ok(()) } - /// Updates market's oracle contract (this is a stage market) - pub fn stage_update_oracle(e: Env, new_oracle: Address) { - require_admin(&e); - - storage::set_oracle(&e, &new_oracle); - } - // Updates pool's status // // # Arguments diff --git a/contracts/market/src/obligation.rs b/contracts/market/src/obligation.rs index 99d87d88..0071fbff 100644 --- a/contracts/market/src/obligation.rs +++ b/contracts/market/src/obligation.rs @@ -377,7 +377,8 @@ impl Obligation { } // Computes the current collateral assets summed value(deposit shares + plain collateral) per - // obligation, scaling each value with the appropriate `close_ltv_bps` value + // obligation, scaling each value with the appropriate `close_ltv_bps` value. + // As a second value, it returns the amount of open positions that are used as collateral that can back up borrows fn compute_collateral_value_scaled_w_close_ltvs( &self, e: &Env, diff --git a/tests/src/liquidate.rs b/tests/src/liquidate.rs index 8e9de477..c779cf1d 100644 --- a/tests/src/liquidate.rs +++ b/tests/src/liquidate.rs @@ -929,3 +929,109 @@ fn test_healthy_position_above_min_collateral_still_healthy() { assert_eq!(result, Err(Ok(MCError::ObligationIsHealthy))); } + +#[test] +fn test_min_collateral_deduction_scales_with_position_count() { + let fixture = TestMarketFixture::new(); + + let liquidity_provider = fixture.users[0].clone(); + let liquidator = fixture.users[1].clone(); + + let single_pos_borrower = fixture.users[2].clone(); + let split_pos_borrower = fixture.users[3].clone(); + + let borrow_pool = fixture.usdc_pool_address.clone(); + let gold_pool = fixture.gold_pool_address.clone(); + let btc_pool = fixture.btc_pool_address.clone(); + + let total_collateral: i128 = 5_000_000; + let half_collateral: i128 = total_collateral / 2; + let debt: i128 = 2_500_000; + + // Deep borrow-pool liquidity so both borrows are serviceable. + fixture.contract_client.deposit( + &ObligationKey::new(liquidity_provider.clone()), + &borrow_pool, + &(10 * total_collateral), + &None, + ); + + // Borrower A: all collateral in a single pool (N = 1). + fixture.contract_client.add_collateral( + &ObligationKey::new(single_pos_borrower.clone()), + &gold_pool, + &total_collateral, + &None, + ); + fixture.contract_client.borrow( + &ObligationKey::new(single_pos_borrower.clone()), + &borrow_pool, + &debt, + &None, + ); + + // Borrower B: same total collateral value & debt, split across two pools (N = 2). + fixture.contract_client.add_collateral( + &ObligationKey::new(split_pos_borrower.clone()), + &gold_pool, + &half_collateral, + &None, + ); + fixture.contract_client.add_collateral( + &ObligationKey::new(split_pos_borrower.clone()), + &btc_pool, + &half_collateral, + &None, + ); + fixture.contract_client.borrow( + &ObligationKey::new(split_pos_borrower.clone()), + &borrow_pool, + &debt, + &None, + ); + + // Raise min_collateral_value_cents to 10 cents -> threshold 1e13. + let update_in_queue_period = fixture.contract_client.get_global_state().update_in_queue_period; + fixture.contract_client.queue_in_market_update( + &DEFAULT_MAX_POSITIONS, + &10, + &DEFAULT_BAD_DEBT_LOCK_D, + ); + fixture.e.ledger().with_mut(|li| li.timestamp += update_in_queue_period); + fixture.contract_client.refresh_pool(&borrow_pool); + fixture.contract_client.refresh_pool(&gold_pool); + fixture.contract_client.refresh_pool(&btc_pool); + fixture.contract_client.apply_market_update(); + + // N = 1: deduction is a single threshold -> still healthy. + let single_pos_result = fixture.contract_client.try_liquidate( + &liquidator, + &ObligationKey::new(single_pos_borrower.clone()), + &borrow_pool, + &gold_pool, + &1, + &0, + ); + assert_eq!( + single_pos_result, + Err(Ok(MCError::ObligationIsHealthy)), + "Single-position borrower must stay healthy: only 1 * threshold is reserved" + ); + + // N = 2: deduction is two thresholds -> now liquidatable. + // Position is solvent, so the close factor caps repayment at 50% of debt; + // repay a meaningful slice so shares are actually burned. + let split_pos_result = fixture.contract_client.try_liquidate( + &liquidator, + &ObligationKey::new(split_pos_borrower.clone()), + &borrow_pool, + &gold_pool, + &(debt / 4), + &0, + ); + assert!( + split_pos_result.is_ok(), + "Two-position borrower must be liquidatable: 2 * threshold is reserved, pushing the \ + close-LTV collateral below the debt. Got: {split_pos_result:?}" + ); +} diff --git a/wasms/deploy/market.wasm b/wasms/deploy/market.wasm index 0ae715e0cbec79acdb70f1b0957e3ce467f9682b..4efdcc87506b2c5c19be5fb1639a50af6e338661 100644 GIT binary patch delta 3394 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 Zf#`v!VX1Db10|ZY3eFcq>pQ?H{|^Yr{lWkM delta 3372 zcmZt}3s_WT_MZRVx$|c3h{G_$>&{3#vK35WQqs7S+Tts_-jSG#JVlw)dTvDv4ln`^q~&S2$!%QxRS_dNdd_|N(O z|Im7lUviFbT9p8cnAu$2qD6JgY*JSTi)NGP=OU=<>~xU2rQ~@+2&?{Bwx7+I4Dl(k zyg7!jX2LS8g%yd5Wm$*5p9S>@&+x#y4n6|23*2)pT0w-0tJ7u;DI*sP>v$SjIN1Iq~nY5Jgd zp^KgyR12NTtgHjX7$PE(vi)vW>Y+JzD{xskfAQ0E@WgbcpTItV2 zUw}91(wuB~Q+X>V3oxb?*1MEAPXmj_*ABlEL)t&Q8TrcGdxrp0Ye(D#i5Rm;GTCO{ zrBiVm?=py-$V*{X2+}hnFQzDjoyegl;n@55R+Ko1mT!aK^9g2NgN@qx)H^xT8X$!0E0ynB1S3yS8GsqI6h6o77*mgk&STarMAeH(1q)>V5hQa{V{Y*>srPmJka7a-(Jc~Ez7xhb(=vX zd7wk2^{`BzG3Av_0Rn4i%$AGLu0VSdz$PW7W4#&L>Atsfk@wTvm8$i}-aQ&EZK8Ap zD=ciM6ZU)nZPd1REUM1lI||{3y`#)+K`ei=vS2MTeZpvDL`K-8-1pZ6fOqJOeaWzeKDlo>efqt8_?GT@uK{|L``=#;5T-qU8v#Ak zxqkuf7}7=Fj{=PE zd%(l+V)ym`@x14x4MOzj$y$UHdWzs9y0vE~gp@}=p9^&2k7)yTwBuGM3a{Wnmvnxi zOem5#2`?F`4V^K9U$8jo*i$JPztsNs7!c!O^QESpxYB?tU3fo;7Gb>G609usP^JRc_X!`bq zs#exJ65-}vycLu;{`I8FO1|(HB;LJHiU(XtyJ%3g2VYvG9`|iO?nhX2r3$vw@2(t% zdgbk_{{ZZ&?bLv+O!{A>Dj^BsReL>uV4;{M-q>H1|fcF-TlQ zYFdw}gy`uT)BCG6CQ=xCn@Gnse*D5G;lZ1&Xy)q83<&;N1RKI!*ag8I7ho91B4@I2 z5Ybf@?uTYMkAs2GB+uob7J{KL2V>M2emx2D3?9zk&RM7h7lh=sS}1|gDjhtG)*jKp z07MIQkSj)l5;kIOc3{axwNn|PNbL&`8|I{5`LGTK!7llR4#pxX(8FLf_mm#IXkm{Y zN-!;aQNx^HWF-*~bR;b~*8tvh)i$fzzTAPf6K>gNRoh)!saNIVO-IG=Y@zK2n2yQF z784Yz*X$8|edKBr40pTn{_);~XT1lRDO^5d?AubcQ83g~;3c6B6A&HV2A%yOj5c1j zL7L+WaC6elo9qIqOY?x)Xfhci0SYJOPi!y`wesR14Ze`)#KBagc1Njjl=9dkvRU?s zY)6#piBd!2BeLo7Fbs>ZG9KFDHfLkZ8WZ=6v*}J)0q@J-I-w1EWtsqk$_)j9%>vK6N3GB$sNrDypp~zvBFF0YDJT)1L;gI}RG91G) zG^M~sL>>|HacQjxvyl2!gloU;fgacrI_QS21h&dg-vL3(R)X)ii1ktj6Je`7G7aq3 z4wWhRMb68JdK^SL98t&o4WW1oK;kl zc(Vu*Yhh%dYK01F(bKlj$#j?r7|uPJ@G%b^GM5c*)iaM{nL2pk%)_E*Pc{sXvN0eQ z*?3VP`o`MsSe?j-9KN4M<2xbiQ22uu zHiYKoLAwrK3fV`&7>(>|hZMP?0A}iWyTHUT43j9IFMuI1Q%)KS59!}Tt^v6_luFDr*^xuP0`(3X1WP4f+VBr?BOiSvsp z%Y1?KDlt0Ai^b)S2XLkjh#7&>c~v6*ip0po-=~?0e(~@B{uh9Jh)5a6@VKw0P#*jm L#D-S3Lagz>BepC8 diff --git a/wasms/deploy_optimized/market.optimized.wasm b/wasms/deploy_optimized/market.optimized.wasm index 991894e5965bd8d3d2a06f74677fdf2c9d78a28e..2f2ce558c4f68474a730b20806ec009daecdb6e9 100644 GIT binary patch delta 3440 zcmZWr4RBON5`I0iZ{O~|-Ruh?n`Ae@+a-hqgaiNO2{EZ zt;@!$i1G9^Fed{XUd71IswA*H$;J|76-4lIib?$lb>5(`P^E+&S!~KS4X5pBocw@MI<$>hR7nQmSV9S5~(Ar2_aN`l=jP1 z2SV1M467@RP#2*RbyJ=ADW%!=er~iQR>=z13~IF!n>%17RyRZP*BArn_Vu?)>rvkFwZ-D&S{Cr;{;<#Y{2J1e2XHR4Wlxm^7$gcK23 zre0P{gPJ0NWTRH6BZE4fPLGGR(cGM;;|WQPNXBb@JR!K!V!Pf1ODknZlq}Lf_-|H$ z2VPif%gk;h%0tWUuPk4@M0%0fRz0v{>Eg=rRnlfQ!j@+_e%!K}-C>&nyI7-bEYcIU zuOP_Z@CcG+K5V3)Zq{V|zrA?%f5Ip(yi->T5cUI;9KR#O>VB*RN)uz*w8V!l88 zL4r$f9Jv<`u^&fP!A^5!Q5#WPh)#^+aDW=;SlMV3dQBK}89ZBwUoti!c0+7PhmbVa zr)_1KW1oVT*$ZQf;brr~u|(CrEwW#>u?;eeS| z`o4@l7S0~Tew_IXyu_ZKRRHyD_pEWy!!FFK#K;S0_b0AHI}p2W95>OOY1YhLLp&lF zF`|}mKt_IuhK&;#${czpAsErCOGcE0bvdP-aMxE9eT`Uf9@1YWs#`MZH=(N*qGf5P z%=~+<7n_^EFwYK~S^svxXh99=#5notVh0w>H=5*NH z$L~h7=Er+dW`(rVewJ6PW_R>^iGpcRiWyz_rVn z@e`2On2tATo?NF>3vRoCHEf)0PTUw5fV(#R4(T1wPx{H4KmW1?cC%1p@t_vsSFRqB z-)0Z0x}-(Td2jkaKd>8DW@sD0@6fF}2@&1m3sM`7?E>$sZ0%dmL=Y^txxolu zstAxgNhi8gNVOo%PK|6qs-;GfSW65&tb_?<>w z;GLq7S05f}CJs-u^p(tdnkt!Ak}4Udy_e^Xk$_~>{ai59-s>Q+#vJ^?Ca@_Zft_s4 z2_Mp?6IB_>>o>Zr;xG`zMZmfp|8eiHT|aOt6Ixj0R29;mQ{`}(-F>G&W`$f;p*khb;>3xafK-%tors@#Y+B~?|4kFt+qdbN9eh8R? z_V3=pA7|Tlcfd|F@clXAM(M?rWkY(WAhgB389C+a19O7WQrqG;jY*f8y5 ze1aVo<5uyl&}j+d9 zNAUN{FR3swUgiX_VS||2A3D*XI1}=7Iv`*%u3VwZvA}M1sZOVw45^*w4`#vxX!S8# zLB~1|+=;?Gj}UluN@`C@y(wvKR&wroWIL7Z92<>>tBL~4&WbK1sD*E#1a1Tlk>F_;D ziJ$u?-|UBj@JhTQ06PdYbKely6>KK>Zoyv#!qlyrkaQZ7bh(fg3!>Kq>>){O5?1(% zu;5fu=9YYTEV&rFL+Za}E5YU{iyy}|&Wx!QNy#Cc&8i8wgfqS;AJz@sA$(ryv&L?d z3et%RG+ic06(ZUZe|RV?0EB(40RC=;CXUa6Kso}l;^R~FOMC`W^x0kn6H{u$DYk$e z1l4*mjDn{4oMOl$cq*$#16Dn684aB|nAaijTU1>VP1mMNx&?o?s(K*4V+_nwaFsF% znryHkzIz(nBCC=ltxwk^2Xg+yZIH{oC9uGrmZeD^RORtV35>BVM$siKUVjXHyuAcQ z*-cc5MSHos6t<-s*_xD&;vD2|eVC}a!Zj-rC%89uxWeD-b>Z7BBgnPpI+RrpfI%aGgg siO%0GgTdsBgYhrR;M6Ey`4mj%Z#)Xu@r}O+E#9vNF674_*#>U)e<{9 delta 3367 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 delta 3742 zcmZu!33L=y7X9y6?+aa>Jt0e_S&}G$u!b!_#qHpPO-04y&@@RCy6G%*CkDo2f*Ld+ zn|w?miv|WHiLw^j0SC#TBjYFzp2*HD&U;n&zx}=c``4y3 zy0fjiW!2rGoJ`YHl$TeKX|$pO%BRuLV>wi8-yTaV7Sbw8DX08%Tv((z5n__Ub=Gbi zwQ_{oI8LC+9LL3m8Bxqebq1S5$LXjJ!a17`@IgoPrf$>}7fbDNJx8^9ef3|_8@p;tkwse|Z>YtYS=m*>na^7&jPZokV%euHpVaj|c% zv%uw_dT+Z)t0!{-Xjboz>1h2%{(QX4;^l3MdI37603REz}3d>W`Ii3-=;PN>nZ~l!9}XrCT-#)3uvseP=qo1+|FXZC)e%FbLV;r zTxfqGH7JXUGx82=(ZP zn{1?p`z}6Wk%pd{jw6~XmSxC+oou0DFzl2Y4bN*pX3^GOAj?_SNgBkK+KaWYX-9OO z5!TA}LK}43P0bb}5CO!4gx@W1a-7k?CV6qn+W;TSk!f}a0ExFVi@Irg1g8WP`$Mb;%|{Bk06tj+fc#QCE|8QaVO}RNChW z4RQg}I9?$!*)1fS@LS~HMmuRw#fnidia!!B(i-pz2CQbQ7JHC~5SpyJ;-uXq$q$+qVyMT>C)5o@Ve z(1y_D7q4-sANle*uzW_%HX<%tgPt2?HH~ zd=0D8DQwJw7!xi{Vd6bSc^wn53-Z2dfzx1=HLPmYNZGL}s04F-&2*$$Ye(Fdu2@^I zfgpQieMV9PP1bj1M3W8T!5Squnrswn)hyZE_5C0y*R4N9al@WA&j;Iw0jv>tM&bQ(g!^+`UXL$J>!N{Lwqni@rFM+sn z9l{pD%#RaH{I4K3YLoS5LC?3dxlIYs!lb5jxXk|6)F0Z}ji!x=to>0bvc0u8BKAY+ zx)#95FR;fCWns(SIF!zx#qtUqe+dK)TI4UXy@#ftZ0z9_3(8_7IxlLRV>yQhprMMx zwWybR}bD)9TdCB zXL8HT$nBY26>_o0q6Tj!Q{e&Z`f%0*2B9~0)7=9l-VI_QvlE|+o2BJ#B$$mXl0R%CT!(asqH4`(+ zgDMSXgwM00lY>!uSvAt2$;A>LS_ZmRPLE{+7qkiTTWKwKMVT z)S15byEC*kQG;>+!d`0iq@iVk-ABU$&SQ2byqSG~Jfj&y%%L>C0oF8CElT_r;1=hOqu7ENd@6LtOEUCkb zG7CF$>`H{iX&z$jlwr^8LkBX zXoo>~KarM4LM^fpQSchFT_Khkt-gI4VgqAf8py#FF))@woAgs0EQh|M z*n{Y<1QpFm1f0Wm>4hX18m0~itq{4;0TRczNb8ay9a^P-CSeEKr4E$B3T6s01})7I zpcjH42#^G8r7r}C!L=g-Z0_pqy5t9Xcqp5rlhRG(u|0Oiw_-f0v+Mgu5iui2C<`FUPn7p=DxH RuK!a14 Date: Fri, 24 Jul 2026 14:34:59 +0000 Subject: [PATCH 3/4] feat: start require market's admin signature for 'queue_in_market_upgrade' on the manager --- contracts/market_manager/src/contract.rs | 7 +++++++ wasms/deploy/market_manager.wasm | Bin 7195 -> 7935 bytes .../market_manager.optimized.wasm | Bin 7195 -> 7935 bytes wasms/market_manager.wasm | Bin 7195 -> 7935 bytes 4 files changed, 7 insertions(+) diff --git a/contracts/market_manager/src/contract.rs b/contracts/market_manager/src/contract.rs index b726decc..419e384f 100644 --- a/contracts/market_manager/src/contract.rs +++ b/contracts/market_manager/src/contract.rs @@ -182,8 +182,11 @@ impl MarketManager for MarketManagerContract { new_wasm_hash: BytesN<32>, ) -> Result<(), MMCError> { extend_instance(&e); + require_admin(&e); require_deployed_market(&e, &market_address)?; + let market_admin = market::Client::new(&e, &market_address).get_global_state().admin; + market_admin.require_auth(); if storage::get_queued_in_market_upgrade(&e, &market_address).is_some() { return Err(MMCError::UpgradeAlreadyExists); @@ -217,12 +220,16 @@ impl MarketManager for MarketManagerContract { fn cancel_market_upgrade(e: Env, market_address: Address) -> Result<(), MMCError> { extend_instance(&e); + require_admin(&e); if storage::get_queued_in_market_upgrade(&e, &market_address).is_none() { return Err(MMCError::UpgradeDoesNotExist); } + let market_admin = market::Client::new(&e, &market_address).get_global_state().admin; + market_admin.require_auth(); + storage::remove_queued_in_market_upgrade(&e, &market_address); Ok(()) diff --git a/wasms/deploy/market_manager.wasm b/wasms/deploy/market_manager.wasm index cb89ab22b9f3b5533b73620b0b9bac721b6fb0fa..25221783da44cfb51955bc14ad61755fcc64128e 100644 GIT binary patch delta 2769 zcmZWrO>7)V6|SG2=^pp=Oxa0nr=8f?zEk+@(=Afa$z#bJfSpA;eO0f|T;q?N*fD|_JxXhA`o(ehPwJ5GW} zu2)s>)%Skty;uF9{`rMr(%N39gb@18ql}x zU8POPtGgZzV=9Tii&{r-voC~*)y1dxWxn1P> z0o%rDN+>y!2f-i9aZ390ftApx*Ly_VghW5T_dNZzUfX|R1Nrs#`eyeIBVMz)w7Idp z(;eJh+S%-qTCugX)ZW@@wwBjdH%MLW)1l$lj<&Y8I(M4ut?sS%PIGr_rQ2F=lh@TF zI(+W@v8C3=QoHja_d|2p*xj5TQ!%2x#%sxp zWE1cyCz)iE+z~GqEmyMW+XzQg6dBh#u@=JNNlwJD4xR9bUJVCSnr%l+tF8RyK|f^L zCSXyGr576OalTR3!O#1yM`9Ke;j0nbr=x1l9!i)r0b+`oKO;kEkEpzp5V=3rDd)LNf6Z zG;)--wHMQzo};<}787`&vqQiHB?>3$tU6byV_YdrQBVD#FiuaZ-xg+)sym1%90b;C z5Eu1xCT8we4$23`Nh(CZXJquKBqlkpS&5!GAr%E5ww{TRbizme=lzJ}qR(ts%t<6P z^t)|9v8)m^D5R|zX9-iCzNztfIPqtI9N^RG$!&C+bG=wT4;Q$0`8VfCRmm_YD(INWCDYkdAKs}cRn4hlu)3OBIv zKLDh>82Uf-qIAW@=XPC43R!+(w}{<-eLlMiHCMWV9==!V%+HEqm>0*P@^4zD<>Gqs z==n}mT|-FB8RIuIe&bG=Z$v^>DW57;gFIB~)`g(w)$hwwRH%QKM?<*do@VT6zdy{f zkcx4H?o~A-DhaX&mm4y38%(^4rMb?b!z)DBMe-rp#i?JI=jGYb$ijwPCt?ig(0)dx z&V#4u(uGW= z=r>4bfo^K3MV%a&;bq9oVoCH*TN{1}bp%nJfDkYVXk3o|Zl~V?#E+*fbPFox5#keg z7V&1LMaK@(k+|+dPVqwZ@M-ij{_uzWC7KYTKUr2fn>SmX=Jrl&r)@r8vX7PS>c;kN zSAX<0zp=ZqywO^3Z+2Ttowk%9jpgHahs$B`Xj9M{)eC* b=r2Ki(ASSbz{2DrXdd*ErVk$s^a}q2q;%6$ delta 1965 zcmZWq-ESL35Z~E7-<^Fvd+jt%>?ZNvC28|rCoQp?rmgQ#DdIy)s-l8~NZrJW5)#+6 z6k1erEu|7KprrfI2VOuzLZYe=s(24CydaP&A@No~yztE*09Bd2vuR6hc|12WJM){b zy?Y1WuXK~z*>xaB^DeNhMptkZa1H z9rnM3!PcQhVrGb4Bg6EpVGv3wp`?T9_^)z`F(4V;(E{); zUD_sAK)lVj{{Jsmp*XZRSzBDJH(y<-Ev>IK$iB{6v$=L*VZGLg)wmBu4}eYr*R@VLA|``H)06Y@5_9LxK_3-Saj2jhYcQDVmg z6?B-Hd?Kk?f_hgmV=u{DTJ64;Deach=Gt0zUrUwtW2H^CwdgnWEP(Gxg3^Dk^qrAD zMQnJ$Kwf@+|>4fklR|1k$1tT2>&OPH%9hka^2^>AQbL@VIEf?!5I z%xhQ|Y`hEHC}0JLeF*EQFnc8C{cc!%N+9ah0bc{_3(!W* zhg7Z+^f383ZNtBUQ}e-H663qEW~dAyKZ#=#r3+!pqUz3TRbC98xKZ;l5dm1lIW0hd zv4?=je^M@vOflVqbT)n284;#1hgpet2~({eQBNlJIuuv<0eL6=G#rp4Tm)zmb*XKY z5piLtljs1O7l|tlY2m@v&K}pQ-k*k}s>KtIfxj%e)_Lxca7khD*@vVST5^$YOH(au zNfc*zPJYMda0iDnYcnNoxjOI0P(Q0snuSZH^Sm&<(kiBpv04DB;wsovS_n-X`Aw!j zHRk9T%KL#}n}jY8CJr06!*K9Y@=9X(T6PT5ay;ATVwJ5yN~6VTw=e9R3w#jmC*^u} z0OwHcpi9+635voGv-trWPVU|eZ-xiAqE#szbHe-Noovr@qharSz@7)V6|SG2=^pp=Oxa0nr=8f?zEk+@(=Afa$z#bJfSpA;eO0f|T;q?N*fD|_JxXhA`o(ehPwJ5GW} zu2)s>)%Skty;uF9{`rMr(%N39gb@18ql}x zU8POPtGgZzV=9Tii&{r-voC~*)y1dxWxn1P> z0o%rDN+>y!2f-i9aZ390ftApx*Ly_VghW5T_dNZzUfX|R1Nrs#`eyeIBVMz)w7Idp z(;eJh+S%-qTCugX)ZW@@wwBjdH%MLW)1l$lj<&Y8I(M4ut?sS%PIGr_rQ2F=lh@TF zI(+W@v8C3=QoHja_d|2p*xj5TQ!%2x#%sxp zWE1cyCz)iE+z~GqEmyMW+XzQg6dBh#u@=JNNlwJD4xR9bUJVCSnr%l+tF8RyK|f^L zCSXyGr576OalTR3!O#1yM`9Ke;j0nbr=x1l9!i)r0b+`oKO;kEkEpzp5V=3rDd)LNf6Z zG;)--wHMQzo};<}787`&vqQiHB?>3$tU6byV_YdrQBVD#FiuaZ-xg+)sym1%90b;C z5Eu1xCT8we4$23`Nh(CZXJquKBqlkpS&5!GAr%E5ww{TRbizme=lzJ}qR(ts%t<6P z^t)|9v8)m^D5R|zX9-iCzNztfIPqtI9N^RG$!&C+bG=wT4;Q$0`8VfCRmm_YD(INWCDYkdAKs}cRn4hlu)3OBIv zKLDh>82Uf-qIAW@=XPC43R!+(w}{<-eLlMiHCMWV9==!V%+HEqm>0*P@^4zD<>Gqs z==n}mT|-FB8RIuIe&bG=Z$v^>DW57;gFIB~)`g(w)$hwwRH%QKM?<*do@VT6zdy{f zkcx4H?o~A-DhaX&mm4y38%(^4rMb?b!z)DBMe-rp#i?JI=jGYb$ijwPCt?ig(0)dx z&V#4u(uGW= z=r>4bfo^K3MV%a&;bq9oVoCH*TN{1}bp%nJfDkYVXk3o|Zl~V?#E+*fbPFox5#keg z7V&1LMaK@(k+|+dPVqwZ@M-ij{_uzWC7KYTKUr2fn>SmX=Jrl&r)@r8vX7PS>c;kN zSAX<0zp=ZqywO^3Z+2Ttowk%9jpgHahs$B`Xj9M{)eC* b=r2Ki(ASSbz{2DrXdd*ErVk$s^a}q2q;%6$ delta 1965 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 Date: Wed, 29 Jul 2026 05:59:46 +0000 Subject: [PATCH 4/4] fix: remove 'market admin' auth form 'cancel_market_upgrade' --- contracts/market_manager/src/contract.rs | 3 --- wasms/deploy/market_manager.wasm | Bin 7935 -> 7681 bytes .../market_manager.optimized.wasm | Bin 7935 -> 7681 bytes wasms/market_manager.wasm | Bin 7935 -> 7681 bytes 4 files changed, 3 deletions(-) diff --git a/contracts/market_manager/src/contract.rs b/contracts/market_manager/src/contract.rs index 419e384f..62cc8089 100644 --- a/contracts/market_manager/src/contract.rs +++ b/contracts/market_manager/src/contract.rs @@ -227,9 +227,6 @@ impl MarketManager for MarketManagerContract { return Err(MMCError::UpgradeDoesNotExist); } - let market_admin = market::Client::new(&e, &market_address).get_global_state().admin; - market_admin.require_auth(); - storage::remove_queued_in_market_upgrade(&e, &market_address); Ok(()) diff --git a/wasms/deploy/market_manager.wasm b/wasms/deploy/market_manager.wasm index 25221783da44cfb51955bc14ad61755fcc64128e..0c01b22061a31b5d9ad967cd8860e76a0ea745b1 100644 GIT binary patch delta 1161 zcmZXT&u<$=6vyYyY`kmldj0Asj%x}T+fi{^=Z6Wc1K4GEsijIlm4+TrFRtaRqP9-r zrUbQ8g;LZx9j=5_nr64 zkE^#TTRZs%%rOQnI7xOH>db)aP-Z|UAsc~r=>)casg~wug|K+sjfiM05w(OsI|lY4 zVLBp`G))Qs25eMB=uHoIR1HoSUUVAGX4rnG-dJ9}w8l=1HQMdgjrwY1t+5hr)HmBJ z8;#|VomAgIDzlJkHrAS9>nZ$_dI008mm|wzyS09Uy%Jpshl;0^%O~JfHN&3+Prb?0 zML*u&SZ}Xi3kP=w>8qRJW>~+p_LS~xYMUR1)9Ndp7az!3wa35f%t&6~EIuN+V(tKfJv zxZUk`xBg{WCZWKsn&AaJ;8I{&l}1yoJA(5Lyhpw0!j&AKWZdK4enXZhK~D25>cO%A z>JeVPkLu@A!Y4)R%mXCP5S5dY>kaSljmp*^fX6qiWkMc1X_uNqafu?%?sBXATAv zSc=mQ>56l-YkEu5dTTH0(-OmAmuZI{N@L{!k^{u2S;7AguJ!}w0%PBQq3_=uXnDcC zo)*cT8OD~_;(>s-_1#nAqOMx^fTqdyM)-f4{eKe61O`=SU^xIhqQ5cM-?LNEpLg~~ HXYBt0ZrI{G delta 1398 zcmZWp&u<$=7@cosy+6FW_OuYkIH4V{Bd{T9+$QaYkfh!vjVd956BVgKpu~z-4%Bf> zAkaz(Hy}{Cpj7imfIzB{B92Iv5Qj>w)FQ+U(O!^1g_bLq@Qv4QqT<86S-&@LzWL_u zZqMw^?(7!chh+j#$5DeClnH?*oWk)U`1pSlB9gfJ%j}8cWyVbErgUZ{)0W8?x07Hq z=MZCt!}P<3fodQ?p3o8SN98=s7k#I;x*E0LTdvjD-)fPmfm*xWytKStYt$Y++-PsS8};^_&%U!2ZAJ3l@RM*x?$D=TL4HjOY}+f#+w}X+aY2iexCuc8Eisdy za5P)c;M2?3N#O7vtL?K)u~!wF>9cH~rHcJhv8g_bzFlVle8K_6f2a6?m`@QG4hVL0 znonU&F6kpMEo^}3NN^c0cyxrI!Oq8M!1*YxC}$GFl2#FDqv|)fDgWW4 z9S{)QR5}M2IDD+D^dQ`WPr_SdN$nckC2xCJyjqr3ZCFwNmKgUE2W2I;me)mBm*vNl zU?qgbSSmbYUm8F_1FUb16upi%B(wk)hCD5x3$eKDnO(8g-Mz#v<}Kyc&L?B{smI+b zp50w=Bd)i^&U()Nc4}?ab04!z#g?6P?0H_D>|n)fc`k@Z`%FR7X9Pi;CMyWsXH^8p zXJ-*?pH&bHpG_eod{#!#eO5#Op9zGN&$0-X&rAe26j$cx8#psVq2ctr+&lEMeA5_} zw^J?ox$!HE%7$5iN%@sIh2uT*Gbqb7E67GB!c^f%}>c6tZHUj zKzRKQ{qUSia=gfsNGqz8{1K+*gXGM>B#%2wms}UbTb^$C|x1V|SHGmE#=pnh_ z0Vas_nz*P{xZowOw#Q}93n($se;QFwq^fm-KaIpAQ%u!EB5&Fr#`A$ajHBahV_?5< zj>0i{&3PHef1Otb(UOES=d?=jw~@CTYI8epa9b|BPY<3Jrh4VDPnf*CElj~hnxB@^ zy~8HCBO9sLQ{}vlgi0vZtIOH+I-Hc>q$hCvEqxM?HNXqmaaE$(i$CTzkC&>BBdh!f zc4mWTI#=+s)IU1DJQT0=QGzh4*zj?c4}6Cfu^^n8dFb_oc7neQJb2*@wjHIaK`7`p qNIi`Ne;Dz{gXBUDuO0Yw2z*%0x!1h{k)+rzJVM$gyFVQsxBmmN)dYwD diff --git a/wasms/deploy_optimized/market_manager.optimized.wasm b/wasms/deploy_optimized/market_manager.optimized.wasm index 25221783da44cfb51955bc14ad61755fcc64128e..0c01b22061a31b5d9ad967cd8860e76a0ea745b1 100644 GIT binary patch delta 1161 zcmZXT&u<$=6vyYyY`kmldj0Asj%x}T+fi{^=Z6Wc1K4GEsijIlm4+TrFRtaRqP9-r zrUbQ8g;LZx9j=5_nr64 zkE^#TTRZs%%rOQnI7xOH>db)aP-Z|UAsc~r=>)casg~wug|K+sjfiM05w(OsI|lY4 zVLBp`G))Qs25eMB=uHoIR1HoSUUVAGX4rnG-dJ9}w8l=1HQMdgjrwY1t+5hr)HmBJ z8;#|VomAgIDzlJkHrAS9>nZ$_dI008mm|wzyS09Uy%Jpshl;0^%O~JfHN&3+Prb?0 zML*u&SZ}Xi3kP=w>8qRJW>~+p_LS~xYMUR1)9Ndp7az!3wa35f%t&6~EIuN+V(tKfJv zxZUk`xBg{WCZWKsn&AaJ;8I{&l}1yoJA(5Lyhpw0!j&AKWZdK4enXZhK~D25>cO%A z>JeVPkLu@A!Y4)R%mXCP5S5dY>kaSljmp*^fX6qiWkMc1X_uNqafu?%?sBXATAv zSc=mQ>56l-YkEu5dTTH0(-OmAmuZI{N@L{!k^{u2S;7AguJ!}w0%PBQq3_=uXnDcC zo)*cT8OD~_;(>s-_1#nAqOMx^fTqdyM)-f4{eKe61O`=SU^xIhqQ5cM-?LNEpLg~~ HXYBt0ZrI{G delta 1398 zcmZWp&u<$=7@cosy+6FW_OuYkIH4V{Bd{T9+$QaYkfh!vjVd956BVgKpu~z-4%Bf> zAkaz(Hy}{Cpj7imfIzB{B92Iv5Qj>w)FQ+U(O!^1g_bLq@Qv4QqT<86S-&@LzWL_u zZqMw^?(7!chh+j#$5DeClnH?*oWk)U`1pSlB9gfJ%j}8cWyVbErgUZ{)0W8?x07Hq z=MZCt!}P<3fodQ?p3o8SN98=s7k#I;x*E0LTdvjD-)fPmfm*xWytKStYt$Y++-PsS8};^_&%U!2ZAJ3l@RM*x?$D=TL4HjOY}+f#+w}X+aY2iexCuc8Eisdy za5P)c;M2?3N#O7vtL?K)u~!wF>9cH~rHcJhv8g_bzFlVle8K_6f2a6?m`@QG4hVL0 znonU&F6kpMEo^}3NN^c0cyxrI!Oq8M!1*YxC}$GFl2#FDqv|)fDgWW4 z9S{)QR5}M2IDD+D^dQ`WPr_SdN$nckC2xCJyjqr3ZCFwNmKgUE2W2I;me)mBm*vNl zU?qgbSSmbYUm8F_1FUb16upi%B(wk)hCD5x3$eKDnO(8g-Mz#v<}Kyc&L?B{smI+b zp50w=Bd)i^&U()Nc4}?ab04!z#g?6P?0H_D>|n)fc`k@Z`%FR7X9Pi;CMyWsXH^8p zXJ-*?pH&bHpG_eod{#!#eO5#Op9zGN&$0-X&rAe26j$cx8#psVq2ctr+&lEMeA5_} zw^J?ox$!HE%7$5iN%@sIh2uT*Gbqb7E67GB!c^f%}>c6tZHUj zKzRKQ{qUSia=gfsNGqz8{1K+*gXGM>B#%2wms}UbTb^$C|x1V|SHGmE#=pnh_ z0Vas_nz*P{xZowOw#Q}93n($se;QFwq^fm-KaIpAQ%u!EB5&Fr#`A$ajHBahV_?5< zj>0i{&3PHef1Otb(UOES=d?=jw~@CTYI8epa9b|BPY<3Jrh4VDPnf*CElj~hnxB@^ zy~8HCBO9sLQ{}vlgi0vZtIOH+I-Hc>q$hCvEqxM?HNXqmaaE$(i$CTzkC&>BBdh!f zc4mWTI#=+s)IU1DJQT0=QGzh4*zj?c4}6Cfu^^n8dFb_oc7neQJb2*@wjHIaK`7`p qNIi`Ne;Dz{gXBUDuO0Yw2z*%0x!1h{k)+rzJVM$gyFVQsxBmmN)dYwD diff --git a/wasms/market_manager.wasm b/wasms/market_manager.wasm index 5d2188584c5c5727a17ce74433b8033b0316bac4..652350808882edc9af894b37e3a6eb6c6569f590 100644 GIT binary patch delta 1161 zcmZXT&uLg0Y77|U5jfRmWe zR3KHgDW#QqY0^1x=EMOmDB=i0syHCXArfj&t=bDxE5Tnt3vc`*L}Cwb*YkPrJMWiY zm#>yq*RwU4A_N+62<;qHi2;|PNB~a)G5}xW39S8AE=)}_X3?k{V&O9A1TG%)}OkUZEoS*A~`rzYc?BKstdKn+I+BFU1`oQ z*X9CpNZo}*YC2J`E!Km^JNP5@Hw-5}4$TG4#?lq?Nq9c!D;`!Z9f2cig6;xOeL<6X zKiXVgYA#(0dUwj?#g$+ssGeJVNB2{;M&E;@>Nd@?@5Q9rr1x7Bg61fR4hSmf7_<1K zW7vZF*V_+?@9-Wq-cqLNnx=_9Wp63f^p>V>pQ3I@Spc7MK=XT=4|TaqqOi?j{e7cI zVV^n~8il;N9D1(ek-WMS`2#BIC)`!>X>sKOts-8VZVCr%p{5eRY++B}jrc|`rpKNv0xOHYFc3-!~suml$|URJ;IO;+Hx zy0PPoJDv_9@c$y`F~^W9N0xqxH{gI;h#x?EGky?@`8}R3<~vDBm^D28#nY@`1?9Wt zwRXF``X5OX0Xb?_3{O%?1>;3k7)&&NV3fAtTkJ&}E@bE^p&s?N8ZwIsQk-XA50*$c zp?~XyjouBk<-ahoFWCxC0w=!u9ZsC{%9cNfZUlFDSgo1)7RvcgwU>kL4&T@D%s_7f zvr*h3U2z6?O>b#ZZ|zxqS|D6*5be-GNnYB9L=Vw%lJozEi`{@JX>9pVcm3-b8d#mdixT)w{mnDoJv$tJw!S$y GVZQ;c0pauj delta 1398 zcmZWp&u<$=6rMM;-XGpwds>KNoY0Qf7T7dt+$QaYkfh!vjVd956BVgKAjgVVF4S>M zAkaz(H=s)8f>O;N0RjnCiZ~)wLL88a)FQ+U(O!^1g_bLq@WvaHsQ577c)s_(dGqF* z-J0E<+ukX>2Xz9_#8HC=R0x4KoW}7o__*GNh$L?OJa_U$g)x)5DVWH#=l{sL}1VuhiEXoklC#sBd;# z8;xc}o|iWvlY1ev+UTrC?f=oU@*WIl=JaONZLeP;^HwVwC|0FQk3t|jqemc=^CQ{e z7v1j0dUySuXm8Jj?Ax2sW+d;AJ_%>#Hhl^fr5VS;zn-EmcGBf!} zN3#VDu3f!F0*CLh+CIw^dqc6A0n7GTs@TsIn;NjF+gBFACmm4y*NPvC`4n;CK)_B; z^C^tWWxWU!@_qfc$p?(Gp7UXW1XtmbM~egnwm(7v&c|p~DU%SEwW>fFRlmVa`8OZy zfq>w)igPf*;p6>C55iseIQ)Sut6hV8fA=!GoVS!(H=m5vryp0Z zdUikI`?%gRJLft3+o{}|=RPKxiY0sLSo4B9*};l0=D8pu?K1^QpAiIYhO8iPpVbf? zpPfUneO5&-Sp5Gt~0UCUWHbjNcc-Wkt@lGB!UNq%}>d1ty*SA zKzQpe{ouSya=gToNGqzG{0?U1!{qGH6puSgmt7_Ze>Uc;b^$Eew4Zt9Re&Bk=n=W( z0Xm56HE~I+a>2`7ZI5Y10qCZh)(ieH68)89YDFl1Ad0SfMC5JTLwi27M{#tVEi~+> z&QUlnzj9u}@gL{qVU-fjp4Y0uUq;??sLk!X!EIT0pB_FVO!efjPw2e7Elj~hnxB!< zz00P!BU`E0QkA@pgmNg>tIN6c8l0A2rYCXyHGK+?HN*?q2~{38v2TC$Z5}UG9Y@yq z5$w!5&-AY2XK8SBd^{Ad^gjooRk7g{${+ZKmarh4nR(dj3GD@c8hG%+S!_Fo5`Iht s^xL8S6@%Z6_~Suxp@!EEd?o}ws^;A5Ux7$cY!@COZIhiJ4^Pz>%