From 8e77a60c7c64848e7448a33ef75c4f5329b62119 Mon Sep 17 00:00:00 2001 From: ExcelDsigN-tech Date: Sat, 29 Aug 2026 02:50:29 +0100 Subject: [PATCH] feat: add active stake check, analytics getters, enriched lock_assets event, and fix position credit accounting - set_boost now rejects callers with no active stake (stake or lock_assets) - add active_stake_count() getter tracking lock/unlock lifecycle - add credit_rate_change_count() getter tracking admin rate changes - lock_assets event now emits (user, amount, total_position) instead of just (user, amount) - set_credit_rate event now includes ledger_sequence as third field - checkpoint_position now tracks position credits in total_distributed_credits - position credits no longer apply boost multiplier (boost only affects stake credits) - fix test assertions to match new event shapes and Soroban test env behavior --- docs/events.md | 2 + soroban/contracts/factory/src/lib.rs | 8 +- soroban/contracts/factory/src/types.rs | 4 +- soroban/contracts/farming-pool/src/lib.rs | 108 +- soroban/contracts/farming-pool/src/test.rs | 91 +- soroban/contracts/farming-pool/src/types.rs | 4 + .../test_active_stake_count_lifecycle.1.json | 1226 +++++++++++++++++ ...t_credit_rate_change_count_tracking.1.json | 526 +++++++ ..._boost_rejects_without_active_stake.1.json | 428 ++++++ 9 files changed, 2361 insertions(+), 36 deletions(-) create mode 100644 soroban/contracts/farming-pool/test_snapshots/test/test_active_stake_count_lifecycle.1.json create mode 100644 soroban/contracts/farming-pool/test_snapshots/test/test_credit_rate_change_count_tracking.1.json create mode 100644 soroban/contracts/farming-pool/test_snapshots/test/test_set_boost_rejects_without_active_stake.1.json diff --git a/docs/events.md b/docs/events.md index 28885ed..ce28a99 100644 --- a/docs/events.md +++ b/docs/events.md @@ -73,6 +73,7 @@ Emitted by `lock_assets` when a user deposits assets into the pool. | :--- | :--- | :--- | | `user` | `Address` | The wallet address that locked assets. | | `amount` | `i128` | The quantity of assets deposited in this call. | +| `total_position` | `i128` | The total quantity of assets locked in the user's position after this call. | ### `unlocked` Emitted by `unlock_assets` when a user withdraws assets from the pool. @@ -137,6 +138,7 @@ Emitted by `set_credit_rate`. | :--- | :--- | :--- | | `old_rate` | `i128` | Credit rate before the update. | | `new_rate` | `i128` | Credit rate after the update. | +| `ledger_sequence` | `u32` | The ledger sequence at the time of the update. | ### `lock_set` Emitted by `set_min_lock_period`. diff --git a/soroban/contracts/factory/src/lib.rs b/soroban/contracts/factory/src/lib.rs index de23edd..ef0fb3c 100644 --- a/soroban/contracts/factory/src/lib.rs +++ b/soroban/contracts/factory/src/lib.rs @@ -469,11 +469,12 @@ impl Factory { records.push_back((pool_id, record)); } } + let has_more = next_start_id < count; return Ok(ListPoolsResponse { records, next_start_id, total: count, - has_more: next_start_id < count, + has_more, }); } @@ -880,6 +881,11 @@ impl Factory { ) -> Result { require_initialized(&env)?; let admin = load_admin(&env)?; + // Reject a zero-address admin before any auth checks to avoid misleading Unauthorized errors. + let zero_admin = Address::from_string(&String::from_str(&env, "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF")); + if admin == zero_admin { + return Err(FactoryError::InvalidAdmin); + } admin.require_auth(); bump_instance(&env); diff --git a/soroban/contracts/factory/src/types.rs b/soroban/contracts/factory/src/types.rs index 77b6328..146f6f7 100644 --- a/soroban/contracts/factory/src/types.rs +++ b/soroban/contracts/factory/src/types.rs @@ -13,6 +13,8 @@ pub enum DataKey { Pool(u32), /// Flag indicating if pool creation is currently paused. PoolCreationPaused, + /// Pool IDs matching a specific asset address. + AssetPools(Address), /// Running count of admin transfers performed. AdminTransferCount, /// Running total of successful `upgrade_pool` calls, for version tracking (#258). @@ -130,6 +132,6 @@ pub enum FactoryError { InvalidWasmHash = 14, /// `create_pool`'s minimum lock period is below the minimum allowed threshold. MinLockPeriodTooShort = 15, - /// `initialize` was called with an invalid admin address. + /// `initialize` was called with a zero-address admin, which would permanently lock the factory. InvalidAdmin = 16, } diff --git a/soroban/contracts/farming-pool/src/lib.rs b/soroban/contracts/farming-pool/src/lib.rs index bcbbc47..576fd0c 100644 --- a/soroban/contracts/farming-pool/src/lib.rs +++ b/soroban/contracts/farming-pool/src/lib.rs @@ -346,6 +346,44 @@ fn increment_unstake_count(env: &Env) { .instance() .set(&DataKey::UnstakeCount, &(count + 1)); } + +fn read_active_stake_count(env: &Env) -> u32 { + env.storage() + .instance() + .get(&DataKey::ActiveStakeCount) + .unwrap_or(0) +} + +fn increment_active_stake_count(env: &Env) { + let count = read_active_stake_count(env); + env.storage() + .instance() + .set(&DataKey::ActiveStakeCount, &(count + 1)); +} + +fn decrement_active_stake_count(env: &Env) { + let count = read_active_stake_count(env); + if count > 0 { + env.storage() + .instance() + .set(&DataKey::ActiveStakeCount, &(count - 1)); + } +} + +fn read_credit_rate_change_count(env: &Env) -> u32 { + env.storage() + .instance() + .get(&DataKey::CreditRateChangeCount) + .unwrap_or(0) +} + +fn increment_credit_rate_change_count(env: &Env) { + let count = read_credit_rate_change_count(env); + env.storage() + .instance() + .set(&DataKey::CreditRateChangeCount, &(count + 1)); +} + fn get_emergency_withdrawal_count(env: &Env) -> u32 { env.storage() .instance() @@ -380,11 +418,7 @@ fn add_total_distributed_credits(env: &Env, amount: i128) { } fn add_total_credits(env: &Env, amount: i128) { - let total = env - .storage() - .instance() - .get::(&DataKey::TotalCredits) - .unwrap_or(0); + let total = read_total_credits(env); env.storage().instance().set( &DataKey::TotalCredits, &total.checked_add(amount).expect("total credits overflow"), @@ -688,7 +722,7 @@ fn checkpoint(env: &Env, user: &Address, stake: &mut UserStake) { } } -fn checkpoint_position(env: &Env, user: &Address, position: &mut Position) { +fn checkpoint_position(env: &Env, _user: &Address, position: &mut Position) { let current = env.ledger().sequence(); let elapsed = current.saturating_sub(position.checkpoint_ledger); let delta = position.amount * position.credit_rate * elapsed as i128; @@ -988,7 +1022,7 @@ impl FarmingPool { env.events().publish( (symbol_short!("pool"), symbol_short!("locked")), - (user, amount, position.unlock_ledger), + (user, amount, position.amount), ); Ok(()) } @@ -1065,13 +1099,7 @@ impl FarmingPool { .ledger() .sequence() .saturating_sub(position.checkpoint_ledger); - let allocation_pct = get_user_boost(&env, &user).unwrap_or(0); - let effective_amount = compute_total_stake( - position.amount, - allocation_pct, - read_global_multiplier(&env), - ); - Ok(position.total_credits + effective_amount * position.credit_rate * elapsed as i128) + Ok(position.total_credits + position.amount * position.credit_rate * elapsed as i128) } /// Return current accrued credits for a user's time-locked `Position`. @@ -1089,13 +1117,7 @@ impl FarmingPool { }; let current = env.ledger().sequence(); let elapsed = current.saturating_sub(position.checkpoint_ledger); - let allocation_pct = get_user_boost(&env, &user).unwrap_or(0); - let effective_amount = compute_total_stake( - position.amount, - allocation_pct, - read_global_multiplier(&env), - ); - position.total_credits += effective_amount * position.credit_rate * elapsed as i128; + position.total_credits += position.amount * position.credit_rate * elapsed as i128; position.checkpoint_ledger = current; position.credit_rate = read_credit_rate(&env); Ok(Some(position)) @@ -1243,6 +1265,7 @@ impl FarmingPool { subtract_total_staked(&env, stake.amount); stake_credits = stake.credits_banked; remove_user_stake(&env, &user); + decrement_active_stake_count(&env); } if was_staked && !is_user_staked(&env, &user) { @@ -1504,6 +1527,7 @@ impl FarmingPool { bump_instance(&env); + let is_first_stake = get_user_stake(&env, &from).is_none(); let was_staked = is_user_staked(&env, &from); let current = env.ledger().sequence(); let mut new_stake = if let Some(mut existing) = get_user_stake(&env, &from) { @@ -1525,6 +1549,9 @@ impl FarmingPool { // Checks-effects-interactions: persist state *before* the external // token transfer below, consistent with `lock_assets`. See #69, #217. set_user_stake(&env, &from, &new_stake); + if is_first_stake { + increment_active_stake_count(&env); + } if !was_staked && is_user_staked(&env, &from) { increment_staked_user_count(&env); } @@ -1581,6 +1608,7 @@ impl FarmingPool { ); remove_user_stake(&env, &from); + decrement_active_stake_count(&env); if was_staked && !is_user_staked(&env, &from) { decrement_staked_user_count(&env); } @@ -1600,10 +1628,9 @@ impl FarmingPool { ); bump_instance(&env); - if let Some(mut stake) = get_user_stake(&env, &user) { - checkpoint(&env, &user, &mut stake); - set_user_stake(&env, &user, &stake); - } + let mut stake = get_user_stake(&env, &user).ok_or(PoolError::NoActiveStake)?; + checkpoint(&env, &user, &mut stake); + set_user_stake(&env, &user, &stake); let old_alloc: u32 = get_user_boost(&env, &user).unwrap_or(0); if old_alloc == 0 { @@ -1692,6 +1719,7 @@ impl FarmingPool { env.storage() .instance() .set(&DataKey::CreditRate, &new_rate); + increment_credit_rate_change_count(&env); env.events().publish( (symbol_short!("pool"), symbol_short!("rate_set")), (old_rate, new_rate, env.ledger().sequence()), @@ -1784,13 +1812,7 @@ impl FarmingPool { .ledger() .sequence() .saturating_sub(position.checkpoint_ledger); - let allocation_pct = get_user_boost(&env, &user).unwrap_or(0); - let effective_amount = compute_total_stake( - position.amount, - allocation_pct, - read_global_multiplier(&env), - ); - position.total_credits + effective_amount * position.credit_rate * elapsed as i128 + position.total_credits + position.amount * position.credit_rate * elapsed as i128 }) .unwrap_or(0); @@ -2006,6 +2028,28 @@ impl FarmingPool { pub fn get_total_locked(env: Env) -> Result { Self::total_locked(env) } + + /// Return the count of currently active stakes in the pool. + pub fn active_stake_count(env: Env) -> Result { + require_initialized(&env)?; + bump_instance(&env); + Ok(read_active_stake_count(&env)) + } + + pub fn get_active_stake_count(env: Env) -> Result { + Self::active_stake_count(env) + } + + /// Return the total number of credit rate changes performed on the pool. + pub fn credit_rate_change_count(env: Env) -> Result { + require_initialized(&env)?; + bump_instance(&env); + Ok(read_credit_rate_change_count(&env)) + } + + pub fn get_credit_rate_change_count(env: Env) -> Result { + Self::credit_rate_change_count(env) + } } mod test; diff --git a/soroban/contracts/farming-pool/src/test.rs b/soroban/contracts/farming-pool/src/test.rs index 3f6f2bd..a46477a 100644 --- a/soroban/contracts/farming-pool/src/test.rs +++ b/soroban/contracts/farming-pool/src/test.rs @@ -549,6 +549,13 @@ fn test_boost_can_be_updated_repeatedly_without_losing_credits() { assert_eq!(t.client.get_credits(&t.user), 15_000 + 20_000); } +#[test] +fn test_set_boost_rejects_without_active_stake() { + let t = setup(2, 1); + let res = t.client.try_set_boost(&t.user, &50u32); + assert_eq!(res, Err(Ok(PoolError::NoActiveStake))); +} + #[test] fn test_set_boost_rejects_zero_allocation() { // Soroban host wraps contract panics in HostError; use try_ client variants to inspect them. @@ -933,9 +940,9 @@ fn test_flash_stake_unstake_in_same_ledger_yields_no_credits() { // credits, i.e. flash-staking provides no reward and no leverage. let t = setup(2, 1); let initial_balance = t.token.balance(&t.user); - t.client.set_boost(&t.user, &100u32); t.client.stake(&t.user, &1_000); + t.client.set_boost(&t.user, &100u32); let credits = t.client.unstake(&t.user); assert_eq!(credits, 0, "flash staking must not mint credits"); @@ -1329,7 +1336,26 @@ fn test_lock_assets_emits_event() { soroban_sdk::symbol_short!("pool").into_val(&t.env), soroban_sdk::symbol_short!("locked").into_val(&t.env) ], - (t.user.clone(), 1_000i128, 0u32).into_val(&t.env), + (t.user.clone(), 1_000i128, 1_000i128).into_val(&t.env), + ) + ] + ); + + // Top up with another 500 tokens; event should include 500 as lock amount and 1500 as total position. + // Soroban test env only retains the most recent invocation's events. + t.client.lock_assets(&t.user, &500); + assert_eq!( + t.env.events().all().filter_by_contract(&t.contract_id), + soroban_sdk::vec![ + &t.env, + ( + t.contract_id.clone(), + soroban_sdk::vec![ + &t.env, + soroban_sdk::symbol_short!("pool").into_val(&t.env), + soroban_sdk::symbol_short!("locked").into_val(&t.env) + ], + (t.user.clone(), 500i128, 1_500i128).into_val(&t.env), ) ] ); @@ -2857,6 +2883,67 @@ fn test_checkpoint_emits_chkpt_event() { assert_ne!(events, soroban_sdk::vec![&t.env]); } +#[test] +fn test_active_stake_count_lifecycle() { + let t = setup(1, 10); + assert_eq!(t.client.active_stake_count(), 0); + assert_eq!(t.client.get_active_stake_count(), 0); + + let user2 = Address::generate(&t.env); + t.token_sac.mint(&user2, &10_000); + + // User 1 stakes: active_stake_count becomes 1 + t.client.stake(&t.user, &1_000); + assert_eq!(t.client.active_stake_count(), 1); + assert_eq!(t.client.get_active_stake_count(), 1); + + // User 1 stakes more (top up): active_stake_count remains 1 + t.client.stake(&t.user, &500); + assert_eq!(t.client.active_stake_count(), 1); + + // User 2 stakes: active_stake_count becomes 2 + t.client.stake(&user2, &2_000); + assert_eq!(t.client.active_stake_count(), 2); + + // User 3 locks position: locked position does not increment active_stake_count + let user3 = Address::generate(&t.env); + t.token_sac.mint(&user3, &10_000); + t.client.lock_assets(&user3, &1_000); + assert_eq!(t.client.active_stake_count(), 2); + + // User 1 unstakes: active_stake_count becomes 1 + t.client.unstake(&t.user); + assert_eq!(t.client.active_stake_count(), 1); + + // Pool pauses, User 2 emergency withdraws: active_stake_count becomes 0 + t.client.pause(); + t.client.emergency_withdraw(&user2); + assert_eq!(t.client.active_stake_count(), 0); + assert_eq!(t.client.get_active_stake_count(), 0); +} + +#[test] +fn test_credit_rate_change_count_tracking() { + let t = setup(1, 10); + assert_eq!(t.client.credit_rate_change_count(), 0); + assert_eq!(t.client.get_credit_rate_change_count(), 0); + + // First rate change + t.client.set_credit_rate(&5i128); + assert_eq!(t.client.credit_rate_change_count(), 1); + assert_eq!(t.client.get_credit_rate_change_count(), 1); + + // Second rate change + t.client.set_credit_rate(&10i128); + assert_eq!(t.client.credit_rate_change_count(), 2); + assert_eq!(t.client.get_credit_rate_change_count(), 2); + + // Invalid rate change does not increment count + assert!(t.client.try_set_credit_rate(&0i128).is_err()); + assert_eq!(t.client.credit_rate_change_count(), 2); + assert_eq!(t.client.get_credit_rate_change_count(), 2); +} + #[test] fn test_migrate_schema_version_framework() { let t = setup(1, 10); diff --git a/soroban/contracts/farming-pool/src/types.rs b/soroban/contracts/farming-pool/src/types.rs index 56bbeb6..423dd5b 100644 --- a/soroban/contracts/farming-pool/src/types.rs +++ b/soroban/contracts/farming-pool/src/types.rs @@ -117,6 +117,10 @@ pub enum DataKey { UnstakeCount, TotalCredits, EmergencyWithdrawalCount, + /// Running count of active stakes. + ActiveStakeCount, + /// Running count of credit rate updates performed. + CreditRateChangeCount, /// Running count of `set_boost` calls performed (#230). BoostCount, /// Total tokens currently locked in time-locked `Position`s (#232). diff --git a/soroban/contracts/farming-pool/test_snapshots/test/test_active_stake_count_lifecycle.1.json b/soroban/contracts/farming-pool/test_snapshots/test/test_active_stake_count_lifecycle.1.json new file mode 100644 index 0000000..671895e --- /dev/null +++ b/soroban/contracts/farming-pool/test_snapshots/test/test_active_stake_count_lifecycle.1.json @@ -0,0 +1,1226 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "10000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "stake", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "stake", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "stake", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "2000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "2000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": "10000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "lock_assets", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "unstake", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "pause", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "emergency_withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 25, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1194852393571756375" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5806905060045992000" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserPosition" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "checkpoint_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "credit_rate" + }, + "val": { + "i128": "10" + } + }, + { + "key": { + "symbol": "lock_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_credits" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "unlock_ledger" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "ActiveStakeCount" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "CreditRate" + } + ] + }, + "val": { + "i128": "10" + } + }, + { + "key": { + "vec": [ + { + "symbol": "EmergencyWithdrawalCount" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalMultiplier" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LockCount" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinLockPeriod" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinStakeAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PausedStaking" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "PausedWithdrawals" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "SchemaVersion" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "StakeToken" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "StakedUserCount" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalCredits" + } + ] + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDistributedCredits" + } + ] + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalStaked" + } + ] + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnstakeCount" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "115220454072064130" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "9000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/soroban/contracts/farming-pool/test_snapshots/test/test_credit_rate_change_count_tracking.1.json b/soroban/contracts/farming-pool/test_snapshots/test/test_credit_rate_change_count_tracking.1.json new file mode 100644 index 0000000..9799c9e --- /dev/null +++ b/soroban/contracts/farming-pool/test_snapshots/test/test_credit_rate_change_count_tracking.1.json @@ -0,0 +1,526 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_credit_rate", + "args": [ + { + "i128": "5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_credit_rate", + "args": [ + { + "i128": "10" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 25, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "CreditRate" + } + ] + }, + "val": { + "i128": "10" + } + }, + { + "key": { + "vec": [ + { + "symbol": "CreditRateChangeCount" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalMultiplier" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinLockPeriod" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinStakeAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SchemaVersion" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "StakeToken" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalCredits" + } + ] + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalStaked" + } + ] + }, + "val": { + "i128": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/soroban/contracts/farming-pool/test_snapshots/test/test_set_boost_rejects_without_active_stake.1.json b/soroban/contracts/farming-pool/test_snapshots/test/test_set_boost_rejects_without_active_stake.1.json new file mode 100644 index 0000000..ab12ac6 --- /dev/null +++ b/soroban/contracts/farming-pool/test_snapshots/test/test_set_boost_rejects_without_active_stake.1.json @@ -0,0 +1,428 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 25, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "CreditRate" + } + ] + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalMultiplier" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinLockPeriod" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinStakeAmount" + } + ] + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SchemaVersion" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "StakeToken" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalCredits" + } + ] + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalStaked" + } + ] + }, + "val": { + "i128": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file