From 5435df5f854bb0459c0a9986a36871d9e36e840b Mon Sep 17 00:00:00 2001 From: Enyinnaya Date: Thu, 26 Mar 2026 15:19:11 +0100 Subject: [PATCH 1/2] fix(contracts): harden treasury withdrawals with enforceable guardrails Introduce admin-controlled per-transaction and daily treasury withdrawal limits with strict pool-balance and invariant validation to block abuse paths. Expose new treasury limit and withdrawal entry points and add focused failure tests so exploit-prevention behavior is locked by CI. Made-with: Cursor --- contracts/src/lib.rs | 25 ++ contracts/src/storage_types.rs | 4 + contracts/src/treasury/mod.rs | 214 +++++++++++++-- contracts/src/treasury/security_tests.rs | 196 ++++++++++++++ contracts/src/treasury/types.rs | 44 +++ .../test_full_config_lifecycle.1.json | 250 +++++++++++++++++- .../test_get_config_reflects_updates.1.json | 242 ++++++++++++++++- .../test_initialize_config_max_fee.1.json | 234 +++++++++++++++- .../test_initialize_config_succeeds.1.json | 234 +++++++++++++++- .../test_initialize_config_zero_fee.1.json | 234 +++++++++++++++- ...t_non_admin_cannot_set_protocol_fee.1.json | 234 +++++++++++++++- .../test_non_admin_cannot_set_treasury.1.json | 234 +++++++++++++++- .../test_reinitialize_config_fails.1.json | 234 +++++++++++++++- .../test_set_protocol_fee_exceeds_max.1.json | 234 +++++++++++++++- .../test_set_protocol_fee_succeeds.1.json | 242 ++++++++++++++++- .../test_set_protocol_fee_to_max.1.json | 242 ++++++++++++++++- .../test_set_protocol_fee_to_zero.1.json | 242 ++++++++++++++++- .../test_set_treasury_succeeds.1.json | 234 +++++++++++++++- ...est_flexi_deposit_with_protocol_fee.1.json | 125 ++++++++- .../tests/test_flexi_fee_rounds_down.1.json | 125 ++++++++- .../test_flexi_small_amount_edge_case.1.json | 37 ++- ...st_flexi_withdraw_with_protocol_fee.1.json | 125 ++++++++- .../test_break_unauthorized_fails.1.json | 172 ++++++++++-- .../test_goal_create_with_protocol_fee.1.json | 125 ++++++++- ...test_goal_deposit_with_protocol_fee.1.json | 125 ++++++++- ...st_goal_fee_calculation_correctness.1.json | 125 ++++++++- ...est_goal_small_amount_fee_edge_case.1.json | 37 ++- ...est_goal_withdraw_with_protocol_fee.1.json | 125 ++++++++- 28 files changed, 4600 insertions(+), 94 deletions(-) create mode 100644 contracts/src/treasury/security_tests.rs diff --git a/contracts/src/lib.rs b/contracts/src/lib.rs index 353f481af..309918e47 100644 --- a/contracts/src/lib.rs +++ b/contracts/src/lib.rs @@ -1017,6 +1017,31 @@ impl NesteraContract { treasury::get_reserve_balance(&env) } + /// Returns treasury withdrawal security limits. + pub fn get_treasury_limits(env: Env) -> treasury::types::TreasurySecurityConfig { + treasury::get_treasury_limits(&env) + } + + /// Updates treasury withdrawal limits (admin only). + pub fn set_treasury_limits( + env: Env, + admin: Address, + max_withdrawal_per_tx: i128, + daily_withdrawal_cap: i128, + ) -> Result { + treasury::set_treasury_limits(&env, &admin, max_withdrawal_per_tx, daily_withdrawal_cap) + } + + /// Withdraws from a treasury pool with per-tx and daily caps (admin only). + pub fn withdraw_treasury( + env: Env, + admin: Address, + pool: treasury::types::TreasuryPool, + amount: i128, + ) -> Result { + treasury::withdraw_treasury(&env, &admin, pool, amount) + } + /// Allocates the unallocated treasury balance into reserves, rewards, and operations. /// Percentages are in basis points and must sum to 10_000. pub fn allocate_treasury( diff --git a/contracts/src/storage_types.rs b/contracts/src/storage_types.rs index ae59d6266..c1a3fbd11 100644 --- a/contracts/src/storage_types.rs +++ b/contracts/src/storage_types.rs @@ -149,6 +149,10 @@ pub enum DataKey { ConfigInitialized, /// Treasury allocation config (reserve/rewards/operations percentages) AllocationConfig, + /// Treasury security limits for admin withdrawals + TreasurySecurityConfig, + /// Daily treasury withdrawal tracker (timestamp + amount) + TreasuryDailyWithdrawal, /// Early break fee (basis points) for goal saves EarlyBreakFeeBps, /// Fee recipient for protocol/treasury fees diff --git a/contracts/src/treasury/mod.rs b/contracts/src/treasury/mod.rs index 0d776ac5e..4dbb83a4c 100644 --- a/contracts/src/treasury/mod.rs +++ b/contracts/src/treasury/mod.rs @@ -1,12 +1,18 @@ pub mod types; +#[cfg(test)] +mod security_tests; #[cfg(test)] mod views_tests; use crate::errors::SavingsError; use crate::storage_types::DataKey; use soroban_sdk::{symbol_short, Address, Env}; -use types::{AllocationConfig, Treasury}; +use types::{ + AllocationConfig, Treasury, TreasuryDailyWithdrawal, TreasuryPool, TreasurySecurityConfig, +}; + +const TREASURY_DAILY_WINDOW_SECS: u64 = 24 * 60 * 60; // ========== Treasury Storage Helpers ========== @@ -23,6 +29,59 @@ fn set_treasury(env: &Env, treasury: &Treasury) { env.storage().persistent().set(&DataKey::Treasury, treasury); } +fn require_admin(env: &Env, admin: &Address) -> Result<(), SavingsError> { + let stored_admin: Address = env + .storage() + .instance() + .get(&DataKey::Admin) + .ok_or(SavingsError::Unauthorized)?; + if stored_admin != *admin { + return Err(SavingsError::Unauthorized); + } + admin.require_auth(); + Ok(()) +} + +fn validate_treasury_state(treasury: &Treasury) -> Result<(), SavingsError> { + if treasury.total_fees_collected < 0 + || treasury.total_yield_earned < 0 + || treasury.reserve_balance < 0 + || treasury.treasury_balance < 0 + || treasury.rewards_balance < 0 + || treasury.operations_balance < 0 + { + return Err(SavingsError::InvariantViolation); + } + Ok(()) +} + +fn get_treasury_limits_internal(env: &Env) -> TreasurySecurityConfig { + env.storage() + .persistent() + .get(&DataKey::TreasurySecurityConfig) + .unwrap_or(TreasurySecurityConfig::default_limits()) +} + +fn set_treasury_limits_internal(env: &Env, limits: &TreasurySecurityConfig) { + env.storage() + .persistent() + .set(&DataKey::TreasurySecurityConfig, limits); +} + +fn get_daily_withdrawal_tracker(env: &Env) -> TreasuryDailyWithdrawal { + let now = env.ledger().timestamp(); + env.storage() + .persistent() + .get(&DataKey::TreasuryDailyWithdrawal) + .unwrap_or(TreasuryDailyWithdrawal::new(now)) +} + +fn set_daily_withdrawal_tracker(env: &Env, tracker: &TreasuryDailyWithdrawal) { + env.storage() + .persistent() + .set(&DataKey::TreasuryDailyWithdrawal, tracker); +} + // ========== Treasury Initialization ========== /// Initializes the treasury with default zero values. @@ -30,6 +89,8 @@ fn set_treasury(env: &Env, treasury: &Treasury) { pub fn initialize_treasury(env: &Env) { let treasury = Treasury::new(); set_treasury(env, &treasury); + set_treasury_limits_internal(env, &TreasurySecurityConfig::default_limits()); + set_daily_withdrawal_tracker(env, &TreasuryDailyWithdrawal::new(env.ledger().timestamp())); } // ========== Fee Recording ========== @@ -45,14 +106,19 @@ pub fn record_fee(env: &Env, amount: i128, fee_type: soroban_sdk::Symbol) { return; } let mut treasury = get_treasury(env); - treasury.total_fees_collected = treasury - .total_fees_collected - .checked_add(amount) - .unwrap_or(treasury.total_fees_collected); - treasury.treasury_balance = treasury - .treasury_balance - .checked_add(amount) - .unwrap_or(treasury.treasury_balance); + if let Some(updated_total_fees) = treasury.total_fees_collected.checked_add(amount) { + treasury.total_fees_collected = updated_total_fees; + } else { + return; + } + if let Some(updated_treasury_balance) = treasury.treasury_balance.checked_add(amount) { + treasury.treasury_balance = updated_treasury_balance; + } else { + return; + } + if validate_treasury_state(&treasury).is_err() { + return; + } set_treasury(env, &treasury); env.events() @@ -65,10 +131,14 @@ pub fn record_yield(env: &Env, amount: i128) { return; } let mut treasury = get_treasury(env); - treasury.total_yield_earned = treasury - .total_yield_earned - .checked_add(amount) - .unwrap_or(treasury.total_yield_earned); + if let Some(updated_total_yield) = treasury.total_yield_earned.checked_add(amount) { + treasury.total_yield_earned = updated_total_yield; + } else { + return; + } + if validate_treasury_state(&treasury).is_err() { + return; + } set_treasury(env, &treasury); } @@ -94,6 +164,112 @@ pub fn get_reserve_balance(env: &Env) -> i128 { get_treasury(env).reserve_balance } +/// Returns current treasury withdrawal safety limits. +pub fn get_treasury_limits(env: &Env) -> TreasurySecurityConfig { + get_treasury_limits_internal(env) +} + +/// Updates treasury withdrawal limits (admin only). +pub fn set_treasury_limits( + env: &Env, + admin: &Address, + max_withdrawal_per_tx: i128, + daily_withdrawal_cap: i128, +) -> Result { + require_admin(env, admin)?; + + if max_withdrawal_per_tx <= 0 || daily_withdrawal_cap <= 0 { + return Err(SavingsError::InvalidAmount); + } + if max_withdrawal_per_tx > daily_withdrawal_cap { + return Err(SavingsError::AmountExceedsLimit); + } + + let limits = TreasurySecurityConfig { + max_withdrawal_per_tx, + daily_withdrawal_cap, + }; + set_treasury_limits_internal(env, &limits); + env.events().publish( + (symbol_short!("trs_lim"),), + (max_withdrawal_per_tx, daily_withdrawal_cap), + ); + + Ok(limits) +} + +/// Withdraws from a treasury sub-balance with per-tx and daily safety caps (admin only). +pub fn withdraw_treasury( + env: &Env, + admin: &Address, + pool: TreasuryPool, + amount: i128, +) -> Result { + require_admin(env, admin)?; + if amount <= 0 { + return Err(SavingsError::InvalidAmount); + } + + let limits = get_treasury_limits_internal(env); + if amount > limits.max_withdrawal_per_tx { + return Err(SavingsError::AmountExceedsLimit); + } + + let now = env.ledger().timestamp(); + let mut daily = get_daily_withdrawal_tracker(env); + if now.saturating_sub(daily.window_start_ts) >= TREASURY_DAILY_WINDOW_SECS { + daily = TreasuryDailyWithdrawal::new(now); + } + + let new_daily_total = daily + .withdrawn_amount + .checked_add(amount) + .ok_or(SavingsError::Overflow)?; + if new_daily_total > limits.daily_withdrawal_cap { + return Err(SavingsError::AmountExceedsLimit); + } + + let mut treasury = get_treasury(env); + match pool.clone() { + TreasuryPool::Reserve => { + if amount > treasury.reserve_balance { + return Err(SavingsError::InsufficientBalance); + } + treasury.reserve_balance = treasury + .reserve_balance + .checked_sub(amount) + .ok_or(SavingsError::InsufficientBalance)?; + } + TreasuryPool::Rewards => { + if amount > treasury.rewards_balance { + return Err(SavingsError::InsufficientBalance); + } + treasury.rewards_balance = treasury + .rewards_balance + .checked_sub(amount) + .ok_or(SavingsError::InsufficientBalance)?; + } + TreasuryPool::Operations => { + if amount > treasury.operations_balance { + return Err(SavingsError::InsufficientBalance); + } + treasury.operations_balance = treasury + .operations_balance + .checked_sub(amount) + .ok_or(SavingsError::InsufficientBalance)?; + } + } + + validate_treasury_state(&treasury)?; + daily.withdrawn_amount = new_daily_total; + set_treasury(env, &treasury); + set_daily_withdrawal_tracker(env, &daily); + env.events() + .publish((symbol_short!("trs_wth"),), (pool, amount, new_daily_total)); + + Ok(treasury) +} + // ========== Allocation Logic ========== /// Allocates the unallocated treasury balance into reserves, rewards, and operations. @@ -118,16 +294,7 @@ pub fn allocate_treasury( rewards_percent: u32, operations_percent: u32, ) -> Result { - // Verify admin - let stored_admin: Address = env - .storage() - .instance() - .get(&DataKey::Admin) - .ok_or(SavingsError::Unauthorized)?; - if stored_admin != *admin { - return Err(SavingsError::Unauthorized); - } - admin.require_auth(); + require_admin(env, admin)?; // Validate percentages sum to 100% let total = reserve_percent @@ -177,6 +344,7 @@ pub fn allocate_treasury( // Zero out the unallocated balance treasury.treasury_balance = 0; + validate_treasury_state(&treasury)?; // Store the allocation config for reference let alloc_config = AllocationConfig { diff --git a/contracts/src/treasury/security_tests.rs b/contracts/src/treasury/security_tests.rs new file mode 100644 index 000000000..c8609b360 --- /dev/null +++ b/contracts/src/treasury/security_tests.rs @@ -0,0 +1,196 @@ +use crate::treasury::types::TreasuryPool; +use crate::{NesteraContract, NesteraContractClient, SavingsError}; +use soroban_sdk::{ + testutils::Address as _, testutils::Ledger as _, Address, BytesN, Env, InvokeError, +}; + +fn setup() -> ( + Env, + soroban_sdk::Address, + NesteraContractClient<'static>, + Address, +) { + let env = Env::default(); + let contract_id = env.register(NesteraContract, ()); + let client = NesteraContractClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let treasury_addr = Address::generate(&env); + let admin_pk = BytesN::from_array(&env, &[8u8; 32]); + + env.mock_all_auths(); + client.initialize(&admin, &admin_pk); + client.initialize_config(&admin, &treasury_addr, &100u32, &100u32, &100u32); + + (env, contract_id, client, admin) +} + +fn seed_and_allocate( + env: &Env, + contract_id: &Address, + client: &NesteraContractClient<'_>, + admin: &Address, + fees: i128, + reserve_percent: u32, + rewards_percent: u32, + operations_percent: u32, +) { + env.as_contract(contract_id, || { + crate::treasury::record_fee(env, fees, soroban_sdk::Symbol::new(env, "dep")); + }); + client.allocate_treasury( + admin, + &reserve_percent, + &rewards_percent, + &operations_percent, + ); +} + +fn assert_savings_error(err: Result, expected: SavingsError) { + assert_eq!(err, Ok(expected)); +} + +#[test] +fn test_max_withdrawal_limit_per_transaction_enforced() { + let (env, contract_id, client, admin) = setup(); + env.mock_all_auths(); + + seed_and_allocate( + &env, + &contract_id, + &client, + &admin, + 20_000, + 5_000, + 3_000, + 2_000, + ); + client.set_treasury_limits(&admin, &1_000, &8_000); + + assert_savings_error( + client + .try_withdraw_treasury(&admin, &TreasuryPool::Reserve, &1_001) + .unwrap_err(), + SavingsError::AmountExceedsLimit, + ); +} + +#[test] +fn test_daily_withdrawal_cap_enforced_across_multiple_operations() { + let (env, contract_id, client, admin) = setup(); + env.mock_all_auths(); + + seed_and_allocate( + &env, + &contract_id, + &client, + &admin, + 30_000, + 5_000, + 3_000, + 2_000, + ); + client.set_treasury_limits(&admin, &3_000, &4_000); + + assert!(client + .try_withdraw_treasury(&admin, &TreasuryPool::Reserve, &2_500) + .is_ok()); + + assert_savings_error( + client + .try_withdraw_treasury(&admin, &TreasuryPool::Rewards, &1_600) + .unwrap_err(), + SavingsError::AmountExceedsLimit, + ); +} + +#[test] +fn test_daily_withdrawal_cap_resets_after_24_hours() { + let (env, contract_id, client, admin) = setup(); + env.mock_all_auths(); + + seed_and_allocate( + &env, + &contract_id, + &client, + &admin, + 30_000, + 5_000, + 3_000, + 2_000, + ); + client.set_treasury_limits(&admin, &3_000, &4_000); + + assert!(client + .try_withdraw_treasury(&admin, &TreasuryPool::Reserve, &3_000) + .is_ok()); + assert_savings_error( + client + .try_withdraw_treasury(&admin, &TreasuryPool::Rewards, &1_100) + .unwrap_err(), + SavingsError::AmountExceedsLimit, + ); + + env.ledger().with_mut(|li| { + li.timestamp += 24 * 60 * 60 + 1; + }); + + assert!(client + .try_withdraw_treasury(&admin, &TreasuryPool::Rewards, &3_000) + .is_ok()); +} + +#[test] +fn test_treasury_withdrawal_validates_pool_balance() { + let (env, contract_id, client, admin) = setup(); + env.mock_all_auths(); + + seed_and_allocate( + &env, + &contract_id, + &client, + &admin, + 10_000, + 4_000, + 4_000, + 2_000, + ); + client.set_treasury_limits(&admin, &10_000, &20_000); + + assert_savings_error( + client + .try_withdraw_treasury(&admin, &TreasuryPool::Operations, &2_001) + .unwrap_err(), + SavingsError::InsufficientBalance, + ); +} + +#[test] +fn test_non_admin_cannot_update_limits_or_withdraw() { + let (env, contract_id, client, admin) = setup(); + let non_admin = Address::generate(&env); + env.mock_all_auths(); + + seed_and_allocate( + &env, + &contract_id, + &client, + &admin, + 15_000, + 5_000, + 3_000, + 2_000, + ); + + assert_savings_error( + client + .try_set_treasury_limits(&non_admin, &1_000, &3_000) + .unwrap_err(), + SavingsError::Unauthorized, + ); + assert_savings_error( + client + .try_withdraw_treasury(&non_admin, &TreasuryPool::Reserve, &500) + .unwrap_err(), + SavingsError::Unauthorized, + ); +} diff --git a/contracts/src/treasury/types.rs b/contracts/src/treasury/types.rs index 0e819aa39..8f939c3b4 100644 --- a/contracts/src/treasury/types.rs +++ b/contracts/src/treasury/types.rs @@ -12,6 +12,15 @@ pub struct Treasury { pub operations_balance: i128, } +/// Defines which treasury sub-balance is used during withdrawal. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum TreasuryPool { + Reserve, + Rewards, + Operations, +} + impl Default for Treasury { fn default() -> Self { Self::new() @@ -31,6 +40,41 @@ impl Treasury { } } +/// Withdrawal safety limits used to protect treasury funds. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TreasurySecurityConfig { + pub max_withdrawal_per_tx: i128, + pub daily_withdrawal_cap: i128, +} + +impl TreasurySecurityConfig { + pub fn default_limits() -> Self { + Self { + // Conservative defaults; admin can tune via set_treasury_limits. + max_withdrawal_per_tx: 10_000_000, + daily_withdrawal_cap: 50_000_000, + } + } +} + +/// Tracks daily withdrawal usage for treasury operations. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TreasuryDailyWithdrawal { + pub window_start_ts: u64, + pub withdrawn_amount: i128, +} + +impl TreasuryDailyWithdrawal { + pub fn new(window_start_ts: u64) -> Self { + Self { + window_start_ts, + withdrawn_amount: 0, + } + } +} + /// Contains allocation percentages for the treasury split #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] diff --git a/contracts/test_snapshots/config_tests/test_full_config_lifecycle.1.json b/contracts/test_snapshots/config_tests/test_full_config_lifecycle.1.json index b9fe79e95..6e2b0fa51 100644 --- a/contracts/test_snapshots/config_tests/test_full_config_lifecycle.1.json +++ b/contracts/test_snapshots/config_tests/test_full_config_lifecycle.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 250 + }, + { + "u32": 250 + }, { "u32": 250 } @@ -84,11 +90,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 500 + }, + { + "u32": 500 + }, { "u32": 500 } @@ -127,11 +139,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 300 + }, + { + "u32": 300 + }, { "u32": 300 } @@ -213,6 +231,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -272,6 +490,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 300 + } + }, { "key": { "vec": [ @@ -288,7 +518,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -300,13 +530,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 300 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_get_config_reflects_updates.1.json b/contracts/test_snapshots/config_tests/test_get_config_reflects_updates.1.json index 1dc1e3252..e50a9de31 100644 --- a/contracts/test_snapshots/config_tests/test_get_config_reflects_updates.1.json +++ b/contracts/test_snapshots/config_tests/test_get_config_reflects_updates.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -82,11 +88,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 500 + }, + { + "u32": 500 + }, { "u32": 500 } @@ -148,6 +160,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -207,6 +419,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 500 + } + }, { "key": { "vec": [ @@ -223,7 +447,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -235,13 +459,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 500 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_initialize_config_max_fee.1.json b/contracts/test_snapshots/config_tests/test_initialize_config_max_fee.1.json index 60c1cc204..743407d22 100644 --- a/contracts/test_snapshots/config_tests/test_initialize_config_max_fee.1.json +++ b/contracts/test_snapshots/config_tests/test_initialize_config_max_fee.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 10000 + }, + { + "u32": 10000 + }, { "u32": 10000 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 10000 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 10000 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_initialize_config_succeeds.1.json b/contracts/test_snapshots/config_tests/test_initialize_config_succeeds.1.json index a2d80149c..054f031d8 100644 --- a/contracts/test_snapshots/config_tests/test_initialize_config_succeeds.1.json +++ b/contracts/test_snapshots/config_tests/test_initialize_config_succeeds.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_initialize_config_zero_fee.1.json b/contracts/test_snapshots/config_tests/test_initialize_config_zero_fee.1.json index b193c5c71..6bab44c10 100644 --- a/contracts/test_snapshots/config_tests/test_initialize_config_zero_fee.1.json +++ b/contracts/test_snapshots/config_tests/test_initialize_config_zero_fee.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 0 + }, + { + "u32": 0 + }, { "u32": 0 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 0 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 0 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_protocol_fee.1.json b/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_protocol_fee.1.json index 2d82ca7fe..602ef0846 100644 --- a/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_protocol_fee.1.json +++ b/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_protocol_fee.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_treasury.1.json b/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_treasury.1.json index 776f084e5..9cb64641d 100644 --- a/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_treasury.1.json +++ b/contracts/test_snapshots/config_tests/test_non_admin_cannot_set_treasury.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_reinitialize_config_fails.1.json b/contracts/test_snapshots/config_tests/test_reinitialize_config_fails.1.json index 2d82ca7fe..602ef0846 100644 --- a/contracts/test_snapshots/config_tests/test_reinitialize_config_fails.1.json +++ b/contracts/test_snapshots/config_tests/test_reinitialize_config_fails.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_set_protocol_fee_exceeds_max.1.json b/contracts/test_snapshots/config_tests/test_set_protocol_fee_exceeds_max.1.json index a2d80149c..054f031d8 100644 --- a/contracts/test_snapshots/config_tests/test_set_protocol_fee_exceeds_max.1.json +++ b/contracts/test_snapshots/config_tests/test_set_protocol_fee_exceeds_max.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -104,6 +110,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -163,6 +369,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -179,7 +397,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -191,13 +409,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_set_protocol_fee_succeeds.1.json b/contracts/test_snapshots/config_tests/test_set_protocol_fee_succeeds.1.json index 2538a3e31..4a7311e1a 100644 --- a/contracts/test_snapshots/config_tests/test_set_protocol_fee_succeeds.1.json +++ b/contracts/test_snapshots/config_tests/test_set_protocol_fee_succeeds.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -60,11 +66,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 500 + }, + { + "u32": 500 + }, { "u32": 500 } @@ -126,6 +138,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -185,6 +397,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 500 + } + }, { "key": { "vec": [ @@ -201,7 +425,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -213,13 +437,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 500 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_max.1.json b/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_max.1.json index 69d89a8a8..6c6f32723 100644 --- a/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_max.1.json +++ b/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_max.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -60,11 +66,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 10000 + }, + { + "u32": 10000 + }, { "u32": 10000 } @@ -125,6 +137,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -184,6 +396,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 10000 + } + }, { "key": { "vec": [ @@ -200,7 +424,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -212,13 +436,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 10000 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_zero.1.json b/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_zero.1.json index 2ddbd9382..89e7ad4e3 100644 --- a/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_zero.1.json +++ b/contracts/test_snapshots/config_tests/test_set_protocol_fee_to_zero.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -60,11 +66,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee", + "function_name": "set_fees", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, + { + "u32": 0 + }, + { + "u32": 0 + }, { "u32": 0 } @@ -126,6 +138,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -185,6 +397,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 0 + } + }, { "key": { "vec": [ @@ -201,7 +425,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -213,13 +437,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 0 + } } ] } diff --git a/contracts/test_snapshots/config_tests/test_set_treasury_succeeds.1.json b/contracts/test_snapshots/config_tests/test_set_treasury_succeeds.1.json index 553b62b98..af7da5b89 100644 --- a/contracts/test_snapshots/config_tests/test_set_treasury_succeeds.1.json +++ b/contracts/test_snapshots/config_tests/test_set_treasury_succeeds.1.json @@ -43,6 +43,12 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -126,6 +132,206 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasuryDailyWithdrawal" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "window_start_ts" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "withdrawn_amount" + }, + "val": { + "i128": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "TreasurySecurityConfig" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "daily_withdrawal_cap" + }, + "val": { + "i128": "50000000" + } + }, + { + "key": { + "symbol": "max_withdrawal_per_tx" + }, + "val": { + "i128": "10000000" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -185,6 +391,18 @@ "bool": true } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -201,7 +419,7 @@ "key": { "vec": [ { - "symbol": "ProtocolFeeBps" + "symbol": "PerformanceFeeBps" } ] }, @@ -213,13 +431,25 @@ "key": { "vec": [ { - "symbol": "Treasury" + "symbol": "TreasuryAddress" } ] }, "val": { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/flexi/tests/test_flexi_deposit_with_protocol_fee.1.json b/contracts/test_snapshots/flexi/tests/test_flexi_deposit_with_protocol_fee.1.json index 38d90efcd..9a89b38cd 100644 --- a/contracts/test_snapshots/flexi/tests/test_flexi_deposit_with_protocol_fee.1.json +++ b/contracts/test_snapshots/flexi/tests/test_flexi_deposit_with_protocol_fee.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 500 + }, + { + "u32": 500 + }, { "u32": 500 } @@ -249,6 +258,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "500" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -452,6 +549,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 500 + } + }, { "key": { "vec": [ @@ -480,7 +589,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -499,6 +608,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 500 + } } ] } diff --git a/contracts/test_snapshots/flexi/tests/test_flexi_fee_rounds_down.1.json b/contracts/test_snapshots/flexi/tests/test_flexi_fee_rounds_down.1.json index d1ba60a74..ef32d64d2 100644 --- a/contracts/test_snapshots/flexi/tests/test_flexi_fee_rounds_down.1.json +++ b/contracts/test_snapshots/flexi/tests/test_flexi_fee_rounds_down.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 125 + }, + { + "u32": 125 + }, { "u32": 125 } @@ -249,6 +258,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "41" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "41" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -452,6 +549,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 125 + } + }, { "key": { "vec": [ @@ -480,7 +589,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -499,6 +608,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 125 + } } ] } diff --git a/contracts/test_snapshots/flexi/tests/test_flexi_small_amount_edge_case.1.json b/contracts/test_snapshots/flexi/tests/test_flexi_small_amount_edge_case.1.json index 22f48f527..86b52d263 100644 --- a/contracts/test_snapshots/flexi/tests/test_flexi_small_amount_edge_case.1.json +++ b/contracts/test_snapshots/flexi/tests/test_flexi_small_amount_edge_case.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -407,6 +416,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -435,7 +456,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -454,6 +475,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/flexi/tests/test_flexi_withdraw_with_protocol_fee.1.json b/contracts/test_snapshots/flexi/tests/test_flexi_withdraw_with_protocol_fee.1.json index a8625ca2b..fd058b8f8 100644 --- a/contracts/test_snapshots/flexi/tests/test_flexi_withdraw_with_protocol_fee.1.json +++ b/contracts/test_snapshots/flexi/tests/test_flexi_withdraw_with_protocol_fee.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 250 + }, + { + "u32": 250 + }, { "u32": 250 } @@ -272,6 +281,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "350" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "350" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -475,6 +572,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 250 + } + }, { "key": { "vec": [ @@ -503,7 +612,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -522,6 +631,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 250 + } } ] } diff --git a/contracts/test_snapshots/goal/tests/test_break_unauthorized_fails.1.json b/contracts/test_snapshots/goal/tests/test_break_unauthorized_fails.1.json index 454d61fe3..0b8330417 100644 --- a/contracts/test_snapshots/goal/tests/test_break_unauthorized_fails.1.json +++ b/contracts/test_snapshots/goal/tests/test_break_unauthorized_fails.1.json @@ -1,6 +1,6 @@ { "generators": { - "address": 3, + "address": 4, "nonce": 0, "mux_id": 0 }, @@ -13,10 +13,13 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "initialize_user", + "function_name": "initialize", "args": [ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } ] } @@ -46,7 +49,26 @@ ], [ [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize_user", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", { "function": { "contract_fn": { @@ -54,7 +76,7 @@ "function_name": "create_goal_save", "args": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { "symbol": "other" @@ -174,7 +196,7 @@ "symbol": "owner" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } }, { @@ -241,6 +263,45 @@ 3110400 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "durability": "persistent", + "val": { + "bool": false + } + } + }, + "ext": "v0" + }, + 3110400 + ] + ], [ { "contract_data": { @@ -251,7 +312,7 @@ "symbol": "User" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -271,7 +332,7 @@ "symbol": "User" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -313,7 +374,7 @@ "symbol": "User" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] }, @@ -333,7 +394,7 @@ "symbol": "User" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] }, @@ -375,7 +436,7 @@ "symbol": "UserGoalSaves" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -395,7 +456,7 @@ "symbol": "UserGoalSaves" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -424,7 +485,7 @@ "symbol": "UserLedger" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -444,7 +505,7 @@ "symbol": "UserLedger" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] }, @@ -518,7 +579,7 @@ "symbol": "UserLedger" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] }, @@ -538,7 +599,7 @@ "symbol": "UserLedger" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] }, @@ -625,6 +686,42 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AdminPublicKey" + } + ] + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, { "key": { "vec": [ @@ -644,7 +741,7 @@ }, "ext": "v0" }, - 4095 + 3110400 ] ], [ @@ -683,10 +780,10 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "4837995959683129791" } }, "durability": "temporary" @@ -698,10 +795,10 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "4837995959683129791" } }, "durability": "temporary", @@ -746,6 +843,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_code": { @@ -764,7 +894,7 @@ }, "ext": "v0" }, - 4095 + 3110400 ] ] ] diff --git a/contracts/test_snapshots/goal/tests/test_goal_create_with_protocol_fee.1.json b/contracts/test_snapshots/goal/tests/test_goal_create_with_protocol_fee.1.json index d6c5e2173..f7ed4afc2 100644 --- a/contracts/test_snapshots/goal/tests/test_goal_create_with_protocol_fee.1.json +++ b/contracts/test_snapshots/goal/tests/test_goal_create_with_protocol_fee.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 500 + }, + { + "u32": 500 + }, { "u32": 500 } @@ -367,6 +376,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "250" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "250" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -619,6 +716,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 500 + } + }, { "key": { "vec": [ @@ -647,7 +756,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -666,6 +775,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 500 + } } ] } diff --git a/contracts/test_snapshots/goal/tests/test_goal_deposit_with_protocol_fee.1.json b/contracts/test_snapshots/goal/tests/test_goal_deposit_with_protocol_fee.1.json index 2c8dbe345..fdae97fc2 100644 --- a/contracts/test_snapshots/goal/tests/test_goal_deposit_with_protocol_fee.1.json +++ b/contracts/test_snapshots/goal/tests/test_goal_deposit_with_protocol_fee.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 300 + }, + { + "u32": 300 + }, { "u32": 300 } @@ -393,6 +402,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "150" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "150" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -645,6 +742,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 300 + } + }, { "key": { "vec": [ @@ -673,7 +782,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -692,6 +801,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 300 + } } ] } diff --git a/contracts/test_snapshots/goal/tests/test_goal_fee_calculation_correctness.1.json b/contracts/test_snapshots/goal/tests/test_goal_fee_calculation_correctness.1.json index 7dc235157..75c48d1d1 100644 --- a/contracts/test_snapshots/goal/tests/test_goal_fee_calculation_correctness.1.json +++ b/contracts/test_snapshots/goal/tests/test_goal_fee_calculation_correctness.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "u32": 1000 + }, { "u32": 1000 } @@ -367,6 +376,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "100" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -619,6 +716,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 1000 + } + }, { "key": { "vec": [ @@ -647,7 +756,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -666,6 +775,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 1000 + } } ] } diff --git a/contracts/test_snapshots/goal/tests/test_goal_small_amount_fee_edge_case.1.json b/contracts/test_snapshots/goal/tests/test_goal_small_amount_fee_edge_case.1.json index ae738d3c8..2f57cdb52 100644 --- a/contracts/test_snapshots/goal/tests/test_goal_small_amount_fee_edge_case.1.json +++ b/contracts/test_snapshots/goal/tests/test_goal_small_amount_fee_edge_case.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 100 + }, + { + "u32": 100 + }, { "u32": 100 } @@ -574,6 +583,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 100 + } + }, { "key": { "vec": [ @@ -602,7 +623,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -621,6 +642,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 100 + } } ] } diff --git a/contracts/test_snapshots/goal/tests/test_goal_withdraw_with_protocol_fee.1.json b/contracts/test_snapshots/goal/tests/test_goal_withdraw_with_protocol_fee.1.json index 77c2552ea..a03b6d237 100644 --- a/contracts/test_snapshots/goal/tests/test_goal_withdraw_with_protocol_fee.1.json +++ b/contracts/test_snapshots/goal/tests/test_goal_withdraw_with_protocol_fee.1.json @@ -73,8 +73,17 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "set_protocol_fee_bps", + "function_name": "set_fees", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 250 + }, + { + "u32": 250 + }, { "u32": 250 } @@ -390,6 +399,94 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Treasury" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "operations_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "reserve_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "rewards_balance" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "total_fees_collected" + }, + "val": { + "i128": "246" + } + }, + { + "key": { + "symbol": "total_yield_earned" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "treasury_balance" + }, + "val": { + "i128": "246" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -642,6 +739,18 @@ "bytes": "0101010101010101010101010101010101010101010101010101010101010101" } }, + { + "key": { + "vec": [ + { + "symbol": "DepositFeeBps" + } + ] + }, + "val": { + "u32": 250 + } + }, { "key": { "vec": [ @@ -670,7 +779,7 @@ "key": { "vec": [ { - "symbol": "PlatformFee" + "symbol": "PerformanceFeeBps" } ] }, @@ -689,6 +798,18 @@ "val": { "bool": false } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalFeeBps" + } + ] + }, + "val": { + "u32": 250 + } } ] } From f7d7aca73c8613779ab46e359ff08dfe0c1f03cb Mon Sep 17 00:00:00 2001 From: Enyinnaya Date: Thu, 26 Mar 2026 16:15:17 +0100 Subject: [PATCH 2/2] feat(contracts): add indexed treasury event logging for full lifecycle visibility Emit frontend-trackable treasury events for fee collection, allocation, withdrawals, reserve usage, and yield distribution while preserving existing legacy event emissions for compatibility. Add dedicated treasury event tests that verify indexed topics so off-chain indexers can reliably detect and attribute treasury actions. Made-with: Cursor --- contracts/src/treasury/event_tests.rs | 176 ++++++++++++++++++++++++++ contracts/src/treasury/mod.rs | 57 ++++++++- 2 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 contracts/src/treasury/event_tests.rs diff --git a/contracts/src/treasury/event_tests.rs b/contracts/src/treasury/event_tests.rs new file mode 100644 index 000000000..9abac8545 --- /dev/null +++ b/contracts/src/treasury/event_tests.rs @@ -0,0 +1,176 @@ +use crate::treasury::types::TreasuryPool; +use crate::{NesteraContract, NesteraContractClient}; +use soroban_sdk::{ + testutils::{Address as _, Events}, + Address, BytesN, Env, IntoVal, Symbol, TryFromVal, Val, +}; + +fn setup() -> ( + Env, + Address, + NesteraContractClient<'static>, + Address, + Address, +) { + let env = Env::default(); + let contract_id = env.register(NesteraContract, ()); + let client = NesteraContractClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let treasury_addr = Address::generate(&env); + let admin_pk = BytesN::from_array(&env, &[9u8; 32]); + + env.mock_all_auths(); + client.initialize(&admin, &admin_pk); + client.initialize_config(&admin, &treasury_addr, &100u32, &100u32, &100u32); + + (env, contract_id, client, admin, treasury_addr) +} + +fn has_indexed_event( + env: &Env, + contract_id: &Address, + event_name: &str, + indexed_1: Option, + indexed_2: Option, +) -> bool { + fn index_matches(env: &Env, actual: Val, expected: Val) -> bool { + if actual.shallow_eq(&expected) { + return true; + } + if let (Ok(actual_symbol), Ok(expected_symbol)) = ( + Symbol::try_from_val(env, &actual), + Symbol::try_from_val(env, &expected), + ) { + return actual_symbol == expected_symbol; + } + if let (Ok(actual_address), Ok(expected_address)) = ( + Address::try_from_val(env, &actual), + Address::try_from_val(env, &expected), + ) { + return actual_address == expected_address; + } + false + } + + let events = env.events().all(); + for i in 0..events.len() { + if let Some((event_contract, topics, data)) = events.get(i) { + if event_contract != *contract_id { + continue; + } + let Some(topic0) = topics.get(0) else { + continue; + }; + let Ok(topic0_symbol) = Symbol::try_from_val(env, &topic0) else { + continue; + }; + if topic0_symbol != Symbol::new(env, event_name) { + continue; + } + if let Some(expected_1) = indexed_1.clone() { + let Some(topic1) = topics.get(1) else { + continue; + }; + if !index_matches(env, topic1, expected_1) { + continue; + } + } + if let Some(expected_2) = indexed_2.clone() { + let Some(topic2) = topics.get(2) else { + continue; + }; + if !index_matches(env, topic2, expected_2) { + continue; + } + } + let _ = data; + return true; + } + } + false +} + +#[test] +fn test_fee_collected_event_emitted() { + let (env, contract_id, _client, _admin, _treasury_addr) = setup(); + env.as_contract(&contract_id, || { + crate::treasury::record_fee(&env, 2_500, Symbol::new(&env, "dep")); + }); + + assert!( + has_indexed_event( + &env, + &contract_id, + "FeeCollected", + Some(Symbol::new(&env, "dep").into_val(&env)), + None, + ), + "FeeCollected event must be emitted with indexed fee type" + ); +} + +#[test] +fn test_treasury_allocated_event_emitted() { + let (env, contract_id, client, admin, _treasury_addr) = setup(); + env.as_contract(&contract_id, || { + crate::treasury::record_fee(&env, 10_000, Symbol::new(&env, "dep")); + }); + client.allocate_treasury(&admin, &4_000u32, &4_000u32, &2_000u32); + + assert!( + has_indexed_event( + &env, + &contract_id, + "TreasuryAllocated", + Some(admin.clone().into_val(&env)), + None, + ), + "TreasuryAllocated event must be emitted with indexed admin" + ); +} + +#[test] +fn test_treasury_withdrawn_and_reserve_used_events_emitted() { + let (env, contract_id, client, admin, _treasury_addr) = setup(); + env.as_contract(&contract_id, || { + crate::treasury::record_fee(&env, 20_000, Symbol::new(&env, "dep")); + }); + client.allocate_treasury(&admin, &5_000u32, &3_000u32, &2_000u32); + client.set_treasury_limits(&admin, &5_000, &10_000); + client.withdraw_treasury(&admin, &TreasuryPool::Reserve, &2_500); + + assert!( + has_indexed_event( + &env, + &contract_id, + "TreasuryWithdrawn", + Some(admin.clone().into_val(&env)), + Some(Symbol::new(&env, "reserve").into_val(&env)), + ), + "TreasuryWithdrawn event must be emitted with indexed admin and pool" + ); + + assert!( + has_indexed_event( + &env, + &contract_id, + "ReserveUsed", + Some(admin.clone().into_val(&env)), + None, + ), + "ReserveUsed event must be emitted when reserve pool is used" + ); +} + +#[test] +fn test_yield_distributed_event_emitted() { + let (env, contract_id, _client, _admin, _treasury_addr) = setup(); + env.as_contract(&contract_id, || { + crate::treasury::record_yield(&env, 1_234); + }); + + assert!( + has_indexed_event(&env, &contract_id, "YieldDistributed", None, None), + "YieldDistributed event must be emitted for treasury yield records" + ); +} diff --git a/contracts/src/treasury/mod.rs b/contracts/src/treasury/mod.rs index 4dbb83a4c..e00db6736 100644 --- a/contracts/src/treasury/mod.rs +++ b/contracts/src/treasury/mod.rs @@ -1,5 +1,7 @@ pub mod types; +#[cfg(test)] +mod event_tests; #[cfg(test)] mod security_tests; #[cfg(test)] @@ -7,12 +9,17 @@ mod views_tests; use crate::errors::SavingsError; use crate::storage_types::DataKey; -use soroban_sdk::{symbol_short, Address, Env}; +use soroban_sdk::{symbol_short, Address, Env, Symbol}; use types::{ AllocationConfig, Treasury, TreasuryDailyWithdrawal, TreasuryPool, TreasurySecurityConfig, }; const TREASURY_DAILY_WINDOW_SECS: u64 = 24 * 60 * 60; +const EVENT_FEE_COLLECTED: &str = "FeeCollected"; +const EVENT_TREASURY_ALLOCATED: &str = "TreasuryAllocated"; +const EVENT_TREASURY_WITHDRAWN: &str = "TreasuryWithdrawn"; +const EVENT_RESERVE_USED: &str = "ReserveUsed"; +const EVENT_YIELD_DISTRIBUTED: &str = "YieldDistributed"; // ========== Treasury Storage Helpers ========== @@ -82,6 +89,14 @@ fn set_daily_withdrawal_tracker(env: &Env, tracker: &TreasuryDailyWithdrawal) { .set(&DataKey::TreasuryDailyWithdrawal, tracker); } +fn pool_to_symbol(env: &Env, pool: &TreasuryPool) -> Symbol { + match pool { + TreasuryPool::Reserve => Symbol::new(env, "reserve"), + TreasuryPool::Rewards => Symbol::new(env, "rewards"), + TreasuryPool::Operations => Symbol::new(env, "operations"), + } +} + // ========== Treasury Initialization ========== /// Initializes the treasury with default zero values. @@ -122,7 +137,9 @@ pub fn record_fee(env: &Env, amount: i128, fee_type: soroban_sdk::Symbol) { set_treasury(env, &treasury); env.events() - .publish((symbol_short!("fee_col"), fee_type), amount); + .publish((symbol_short!("fee_col"), fee_type.clone()), amount); + env.events() + .publish((Symbol::new(env, EVENT_FEE_COLLECTED), fee_type), amount); } /// Records yield earned into the treasury. @@ -140,6 +157,10 @@ pub fn record_yield(env: &Env, amount: i128) { return; } set_treasury(env, &treasury); + env.events().publish( + (Symbol::new(env, EVENT_YIELD_DISTRIBUTED),), + (amount, treasury.total_yield_earned), + ); } // ========== Read-Only Treasury Views ========== @@ -264,8 +285,25 @@ pub fn withdraw_treasury( daily.withdrawn_amount = new_daily_total; set_treasury(env, &treasury); set_daily_withdrawal_tracker(env, &daily); - env.events() - .publish((symbol_short!("trs_wth"),), (pool, amount, new_daily_total)); + let pool_symbol = pool_to_symbol(env, &pool); + env.events().publish( + ( + Symbol::new(env, EVENT_TREASURY_WITHDRAWN), + admin.clone(), + pool_symbol, + ), + (amount, new_daily_total), + ); + env.events().publish( + (symbol_short!("trs_wth"),), + (pool.clone(), amount, new_daily_total), + ); + if pool == TreasuryPool::Reserve { + env.events().publish( + (Symbol::new(env, EVENT_RESERVE_USED), admin.clone()), + (amount, treasury.reserve_balance), + ); + } Ok(treasury) } @@ -362,6 +400,17 @@ pub fn allocate_treasury( (symbol_short!("alloc"),), (reserve_amount, rewards_amount, operations_amount), ); + env.events().publish( + (Symbol::new(env, EVENT_TREASURY_ALLOCATED), admin.clone()), + ( + reserve_amount, + rewards_amount, + operations_amount, + reserve_percent, + rewards_percent, + operations_percent, + ), + ); Ok(treasury) }