From ff8e9075e23a30415287e59ce5d23b05bb7e03ba Mon Sep 17 00:00:00 2001 From: xeladev4 Date: Fri, 19 Jun 2026 20:58:09 +0100 Subject: [PATCH 1/2] fix(lending_pool): base share accounting on tracked managed assets, not raw balance Share value for both minting and redemption was derived from the raw TokenClient::balance of the pool. That let the price swing while loan principal was out (a receivable) and let anyone inflate it by transferring tokens directly to the pool address (donation / inflation attack), while redeem_shares subtracted the full yield-inclusive payout from TotalDeposits, causing principal drift. Introduce TotalManagedAssets (principal + realized yield, net of withdrawals) as the single source of truth for the share<->asset exchange rate, moved only by deposit, redeem, and an admin-gated record_yield. The raw balance is now a liquidity gate only (InsufficientLiquidity on under-funded redemptions). redeem_shares reduces TotalDeposits by the principal portion only. Adds record_yield (emitting YieldDistributed), bumps version 3->4, documents the model, and adds tests for outstanding loans, direct transfers, the inflation attack, and principal reconciliation. Closes #2 --- lending_pool/src/events.rs | 1 - lending_pool/src/lib.rs | 150 +- lending_pool/src/test.rs | 283 +++- .../test/test_accept_admin_flow.1.json | 2 +- ...dmin_with_no_proposed_returns_error.1.json | 2 +- .../test/test_admin_transfer_flow.1.json | 2 +- ...cks_deposits_but_allows_withdrawals.1.json | 20 +- ...osit_after_withdraw_frees_cap_space.1.json | 20 +- ...t_and_redeem_while_loan_outstanding.1.json | 1269 +++++++++++++++++ .../test_deposit_at_max_cap_edge_cases.1.json | 20 +- .../test_deposit_blocked_when_paused.1.json | 2 +- .../test/test_deposit_event_emission.1.json | 20 +- .../test_deposit_exceeds_cap_panics.1.json | 2 +- .../test/test_deposit_flow.1.json | 20 +- .../test/test_deposit_unauthorized.1.json | 2 +- .../test_deposit_withdraw_invariants.1.json | 20 +- .../test_deposit_withdraw_invariants.2.json | 20 +- .../test_deposit_withdraw_invariants.3.json | 20 +- .../test_deposit_withdraw_invariants.4.json | 20 +- .../test_deposit_withdraw_invariants.5.json | 20 +- .../test_deposit_withdraw_invariants.6.json | 20 +- .../test_deposit_within_cap_succeeds.1.json | 20 +- ...er_does_not_change_redeemable_value.1.json | 988 +++++++++++++ ...s_not_zero_out_subsequent_depositor.1.json | 28 +- ...est_double_initialize_returns_error.1.json | 2 +- ...owed_while_paused_bypasses_cooldown.1.json | 20 +- ...gency_withdraw_emits_distinct_event.1.json | 20 +- ...y_withdraw_rejected_when_not_paused.1.json | 20 +- .../test_full_loan_cycle_with_interest.1.json | 87 +- ...get_admin_returns_initialized_admin.1.json | 2 +- ...test_get_depositor_yield_no_deposit.1.json | 2 +- ...tor_yield_reflects_accrued_interest.1.json | 78 +- ...ithdraw_panics_when_cooldown_active.1.json | 20 +- ...on_attack_via_donation_is_prevented.1.json | 1173 +++++++++++++++ ...insufficient_balance_withdraw_panic.1.json | 20 +- ...positors_receive_proportional_yield.1.json | 94 +- ...ly_and_total_shares_track_correctly.1.json | 94 +- .../test_multiple_tokens_independence.1.json | 38 +- .../test/test_negative_deposit_panic.1.json | 2 +- .../test/test_negative_withdraw_panic.1.json | 2 +- ...st_no_cap_allows_unlimited_deposits.1.json | 20 +- .../test/test_pool_stats.1.json | 20 +- ...eflect_funds_allocated_and_returned.1.json | 20 +- ...ta_yield_distribution_on_withdrawal.1.json | 94 +- ...rejected_when_no_shares_outstanding.1.json | 318 +++++ .../test_record_yield_requires_admin.1.json | 866 +++++++++++ ...set_admin_updates_admin_immediately.1.json | 2 +- .../test_set_and_get_max_pool_size.1.json | 2 +- ...test_set_max_pool_size_unauthorized.1.json | 2 +- ...t_set_negative_max_pool_size_panics.1.json | 2 +- ...oldown_rejects_values_above_maximum.1.json | 2 +- ...ice_increases_when_interest_arrives.1.json | 78 +- ...rice_is_one_to_one_before_any_yield.1.json | 20 +- ...ice_rises_proportionally_with_yield.1.json | 88 +- ...or_does_not_dilute_existing_holders.1.json | 94 +- ...s_principal_after_yield_then_redeem.1.json | 1014 +++++++++++++ .../test_unauthorized_admin_actions.1.json | 2 +- .../test_upgrade_requires_admin_auth.1.json | 2 +- .../test/test_version_is_initialized.1.json | 2 +- .../test_withdraw_blocked_when_paused.1.json | 20 +- .../test/test_withdraw_flow.1.json | 20 +- ...est_withdraw_reduces_total_deposits.1.json | 20 +- ...raw_returns_principal_plus_interest.1.json | 90 +- ...st_withdraw_succeeds_after_cooldown.1.json | 20 +- .../test_withdrawal_with_utilization.1.json | 38 +- ..._access_controls_unauthorized_repay.1.json | 2 +- ...t_admin_transfer_via_propose_accept.1.json | 2 +- .../test_approve_already_approved_loan.1.json | 2 +- ...unts_for_outstanding_approved_loans.1.json | 2 +- ...hen_pool_has_insufficient_liquidity.1.json | 2 +- .../test/test_approve_loan_flow.1.json | 2 +- ...ve_loan_insufficient_pool_liquidity.1.json | 2 +- .../test/test_approve_nonexistent_loan.1.json | 2 +- ...uest_after_cancel_and_reject_at_cap.1.json | 2 +- ...ax_active_loans_blocks_new_requests.1.json | 2 +- ...oans_enforced_and_released_on_repay.1.json | 2 +- ...ncel_loan_decrements_borrower_count.1.json | 2 +- .../test/test_cancel_pending_loan.1.json | 2 +- ...cel_pending_loan_returns_collateral.1.json | 2 +- .../test_check_default_already_repaid.1.json | 2 +- .../test_check_default_not_past_due.1.json | 2 +- ...eck_default_respects_default_window.1.json | 2 +- .../test/test_check_default_success.1.json | 2 +- .../test/test_check_defaults_batch.1.json | 2 +- ...llateral_is_seized_on_batch_default.1.json | 2 +- ...est_collateral_is_seized_on_default.1.json | 2 +- ...llateral_release_works_while_paused.1.json | 2 +- ...able_interest_rate_and_default_term.1.json | 2 +- ..._and_auto_release_on_full_repayment.1.json | 2 +- ..._collateral_rejects_non_active_loan.1.json | 2 +- .../test/test_extend_loan_charges_fee.1.json | 2 +- .../test/test_extend_loan_happy_path.1.json | 2 +- ...st_extend_loan_max_extensions_limit.1.json | 2 +- ...est_extend_loan_multiple_extensions.1.json | 2 +- .../test/test_extend_loan_not_found.1.json | 2 +- ...nd_loan_rejected_for_defaulted_loan.1.json | 2 +- ...tend_loan_rejected_for_pending_loan.1.json | 2 +- ...xtend_loan_rejected_for_repaid_loan.1.json | 2 +- ...tend_loan_rejected_for_zero_ledgers.1.json | 2 +- .../test_extend_loan_wrong_borrower.1.json | 2 +- ...ll_repayment_ignores_minimum_amount.1.json | 2 +- .../test/test_get_borrower_loans.1.json | 2 +- ...nterest_calculation_overflow_safety.1.json | 2 +- ...st_late_fee_cap_at_total_debt_limit.1.json | 2 +- ...s_stop_accruing_when_principal_paid.1.json | 2 +- ...ull_repayment_applies_score_penalty.1.json | 2 +- ...terest_config_falls_back_to_default.1.json | 2 +- ...te_rejects_healthy_collateral_ratio.1.json | 2 +- ...hreshold_transfers_bonus_and_refund.1.json | 2 +- ...test_liquidation_bonus_cap_enforced.1.json | 2 +- ...test_loan_request_failure_low_score.1.json | 2 +- .../test/test_loan_request_success.1.json | 2 +- ...ion_guard_prevents_double_execution.1.json | 2 +- ...t_minimum_repayment_amount_enforced.1.json | 2 +- .../test/test_non_admin_cannot_pause.1.json | 2 +- ...ate_above_max_falls_back_to_default.1.json | 2 +- ...ate_below_min_falls_back_to_default.1.json | 2 +- ..._oracle_rate_within_bounds_accepted.1.json | 2 +- ...l_repayment_still_reduces_principal.1.json | 2 +- ..._overdue_repayment_charges_late_fee.1.json | 2 +- ...ial_repayment_tracks_split_balances.1.json | 2 +- .../test_pause_blocks_approve_loan.1.json | 2 +- .../test/test_pause_blocks_repay.1.json | 2 +- .../test_pause_blocks_request_loan.1.json | 2 +- ...ments_but_allows_collateral_release.1.json | 2 +- ...est_pending_loans_count_against_cap.1.json | 2 +- .../test/test_query_functions.1.json | 2 +- .../test_rate_bounds_boundary_values.1.json | 2 +- ...e_bounds_configurable_independently.1.json | 2 +- ...te_bounds_persist_across_operations.1.json | 2 +- ...es_principal_returns_excess_to_pool.1.json | 2 +- ...ails_when_score_drops_below_minimum.1.json | 2 +- ...increases_principal_draws_from_pool.1.json | 2 +- ...ject_loan_decrements_borrower_count.1.json | 2 +- .../test/test_reject_pending_loan.1.json | 2 +- ...ect_pending_loan_returns_collateral.1.json | 2 +- .../test/test_repayment_flow.1.json | 2 +- ...request_loan_above_max_amount_fails.1.json | 2 +- .../test_request_loan_negative_amount.1.json | 2 +- ...set_admin_updates_admin_immediately.1.json | 2 +- ...est_set_interest_rate_zero_rejected.1.json | 2 +- ...set_late_fee_rate_rejects_above_cap.1.json | 2 +- ...est_set_max_rate_below_min_rejected.1.json | 2 +- .../test/test_set_max_rate_bps_success.1.json | 2 +- ...test_set_max_rate_bps_zero_rejected.1.json | 2 +- .../test/test_set_min_rate_bps_success.1.json | 2 +- ...test_set_min_rate_bps_zero_rejected.1.json | 2 +- ...t_set_min_rate_exceeds_max_rejected.1.json | 2 +- ...all_loan_interest_accrual_precision.1.json | 2 +- ...all_repayment_does_not_change_score.1.json | 2 +- .../test_unpause_restores_request_loan.1.json | 2 +- .../test_upgrade_requires_admin_auth.1.json | 2 +- 152 files changed, 7421 insertions(+), 254 deletions(-) create mode 100644 lending_pool/test_snapshots/test/test_deposit_and_redeem_while_loan_outstanding.1.json create mode 100644 lending_pool/test_snapshots/test/test_direct_transfer_does_not_change_redeemable_value.1.json create mode 100644 lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json create mode 100644 lending_pool/test_snapshots/test/test_record_yield_rejected_when_no_shares_outstanding.1.json create mode 100644 lending_pool/test_snapshots/test/test_record_yield_requires_admin.1.json create mode 100644 lending_pool/test_snapshots/test/test_total_deposits_tracks_principal_after_yield_then_redeem.1.json diff --git a/lending_pool/src/events.rs b/lending_pool/src/events.rs index 6c99a89..1749be6 100644 --- a/lending_pool/src/events.rs +++ b/lending_pool/src/events.rs @@ -24,7 +24,6 @@ pub fn emergency_withdraw( env.events().publish(topics, (amount, shares_burned)); } -#[allow(dead_code)] pub fn yield_distributed(env: &Env, token: Address, amount: i128) { let topics = (Symbol::new(env, "YieldDistributed"), token); env.events().publish(topics, amount); diff --git a/lending_pool/src/lib.rs b/lending_pool/src/lib.rs index 47845ce..a653baf 100644 --- a/lending_pool/src/lib.rs +++ b/lending_pool/src/lib.rs @@ -27,8 +27,27 @@ pub enum PoolError { /// /// v2 replaces the accumulator-style keys (Deposit, RewardDebt, ClaimableYield, /// AccYieldPerDeposit, UnclaimedYieldPool) with a share-based (LP-token) model. -/// Yield is now implicit in the exchange rate between shares and underlying -/// assets — no separate accumulation or claim step is required. +/// Yield is implicit in the exchange rate between shares and underlying assets — +/// no separate accumulation or claim step is required. +/// +/// ## Accounting source of truth (v3, issue #2) +/// +/// Share value is derived **exclusively** from `TotalManagedAssets`, an +/// internally-tracked figure equal to deposited principal plus realized yield, +/// net of withdrawals. It is deliberately *not* derived from the contract's raw +/// `TokenClient::balance`, because the raw balance: +/// * drops while principal is out on loan (the principal is still a pool asset, +/// just a receivable — share value must not swing with utilisation), and +/// * can be inflated by anyone transferring tokens directly to the pool +/// address (a donation / inflation attack that would otherwise let an +/// attacker arbitrarily move existing holders' redeemable value). +/// +/// The raw balance is used only as a *liquidity* gate: a redemption that cannot +/// currently be serviced from on-hand tokens fails with `InsufficientLiquidity` +/// rather than mis-pricing shares. Realized yield (e.g. loan interest repaid +/// into the pool) is folded into `TotalManagedAssets` exclusively through the +/// admin-gated `record_yield` entry point, so unsolicited transfers never change +/// the exchange rate. /// /// All per-token keys carry the token address so one contract instance can /// serve multiple token liquidity pools. @@ -47,8 +66,15 @@ pub enum DataKey { /// (provider, token) → ledger sequence of the most recent deposit DepositTimestamp(Address, Address), /// token → total principal deposited (net of withdrawals); used for - /// utilisation stats and the MaxPoolSize cap + /// utilisation stats and the MaxPoolSize cap. Tracks principal only — it is + /// never moved by yield, so it cannot drift above what was actually + /// deposited. TotalDeposits(Address), + /// token → total underlying assets backing LP shares (principal + realized + /// yield, net of withdrawals). Single source of truth for the share↔asset + /// exchange rate. Unaffected by direct token transfers or by principal + /// temporarily out on loan. See the module-level accounting note. + TotalManagedAssets(Address), /// token → number of active depositors DepositorCount(Address), ProposedAdmin, @@ -77,7 +103,7 @@ impl LendingPool { const INSTANCE_TTL_BUMP: u32 = 518400; const PERSISTENT_TTL_THRESHOLD: u32 = 17280; const PERSISTENT_TTL_BUMP: u32 = 518400; - const CURRENT_VERSION: u32 = 3; + const CURRENT_VERSION: u32 = 4; const DEFAULT_WITHDRAWAL_COOLDOWN: u32 = 1_440; const SHARE_PRICE_SCALE: i128 = 1_000_000; const MAX_WITHDRAWAL_COOLDOWN_LEDGERS: u32 = 17_280 * 30; @@ -128,6 +154,24 @@ impl LendingPool { .unwrap_or(0) } + /// Total underlying assets backing LP shares (principal + realized yield, + /// net of withdrawals). The single source of truth for the share↔asset + /// exchange rate — see the module-level accounting note. + fn total_managed_assets(env: &Env, token: &Address) -> i128 { + Self::bump_instance_ttl(env); + env.storage() + .instance() + .get(&DataKey::TotalManagedAssets(token.clone())) + .unwrap_or(0) + } + + fn set_total_managed_assets(env: &Env, token: &Address, value: i128) { + env.storage() + .instance() + .set(&DataKey::TotalManagedAssets(token.clone()), &value); + Self::bump_instance_ttl(env); + } + fn read_shares(env: &Env, provider: &Address, token: &Address) -> i128 { let key = DataKey::Shares(provider.clone(), token.clone()); let shares: i128 = env.storage().persistent().get(&key).unwrap_or(0); @@ -272,13 +316,32 @@ impl LendingPool { } let cur_total_shares = Self::total_shares(env, token); - let total_assets = Self::read_pool_balance(env, token); + // Redemption value is derived from internally-tracked managed assets, not + // the raw token balance, so it cannot be manipulated by direct transfers + // and does not swing while principal is out on loan (issue #2). + let total_assets = Self::total_managed_assets(env, token); let assets_to_return = Self::calc_assets_to_redeem(shares, total_assets, cur_total_shares)?; if assets_to_return <= 0 { return Err(PoolError::InvalidAmount); } + // Liquidity gate: the redemption must be serviceable from tokens the pool + // physically holds. If principal is currently out on loan the share value + // is unchanged, but the redemption is deferred rather than mis-priced. + let liquid_balance = Self::read_pool_balance(env, token); + if liquid_balance < assets_to_return { + return Err(PoolError::InsufficientLiquidity); + } + + // Principal portion being redeemed, used to keep TotalDeposits tracking + // principal only (it must not absorb the yield portion of the payout). + let cur_total_deposits = Self::total_deposits(env, token); + let principal_redeemed = shares + .checked_mul(cur_total_deposits) + .and_then(|v| v.checked_div(cur_total_shares)) + .expect("principal redeem overflow"); + TokenClient::new(env, token).transfer( &env.current_contract_address(), provider, @@ -309,7 +372,15 @@ impl LendingPool { .instance() .set(&DataKey::TotalShares(token.clone()), &new_total_shares); - let new_total_deposits = Self::total_deposits(env, token).saturating_sub(assets_to_return); + // Managed assets shrink by the full payout (principal + yield portion). + let new_managed_assets = total_assets + .checked_sub(assets_to_return) + .expect("managed assets underflow"); + Self::set_total_managed_assets(env, token, new_managed_assets); + + // TotalDeposits shrinks by the principal portion only, so it never drifts + // away from actual net principal (issue #2, acceptance criterion 4). + let new_total_deposits = cur_total_deposits.saturating_sub(principal_redeemed); env.storage() .instance() .set(&DataKey::TotalDeposits(token.clone()), &new_total_deposits); @@ -426,6 +497,14 @@ impl LendingPool { Self::total_shares(&env, &token) } + /// Total underlying assets backing LP shares (principal + realized yield), + /// i.e. the value the outstanding shares collectively redeem to. This is the + /// accounting figure that drives the share price — distinct from + /// `pool_balance` (raw on-hand tokens) and `get_total_deposits` (principal). + pub fn get_total_managed_assets(env: Env, token: Address) -> i128 { + Self::total_managed_assets(&env, &token) + } + pub fn get_withdrawal_cooldown(env: Env) -> u32 { Self::withdrawal_cooldown(&env) } @@ -464,9 +543,11 @@ impl LendingPool { } } - // Snapshot pool state *before* the transfer so the share price - // reflects the pre-deposit pool composition. - let total_assets_before = Self::read_pool_balance(&env, &token); + // Snapshot pool state *before* the transfer so the share price reflects + // the pre-deposit pool composition. Uses internally-tracked managed + // assets (not the raw balance) so a direct transfer made just before the + // deposit cannot dilute or inflate the minted shares (issue #2). + let total_assets_before = Self::total_managed_assets(&env, &token); let cur_total_shares = Self::total_shares(&env, &token); // Issue #1: first depositor must commit at least MINIMUM_INITIAL_DEPOSIT @@ -524,6 +605,12 @@ impl LendingPool { .instance() .set(&DataKey::TotalDeposits(token.clone()), &new_total_deposits); + // Deposited principal joins the managed-asset base 1:1. + let new_managed_assets = total_assets_before + .checked_add(amount) + .expect("managed assets overflow"); + Self::set_total_managed_assets(&env, &token, new_managed_assets); + Self::bump_instance_ttl(&env); deposit( &env, @@ -551,7 +638,7 @@ impl LendingPool { } let asset_value = Self::calc_assets_to_redeem( shares, - Self::read_pool_balance(&env, &token), + Self::total_managed_assets(&env, &token), cur_total_shares, ) .unwrap_or(0); @@ -570,7 +657,7 @@ impl LendingPool { } Self::calc_assets_to_redeem( shares, - Self::read_pool_balance(&env, &token), + Self::total_managed_assets(&env, &token), cur_total_shares, ) .unwrap_or(0) @@ -583,13 +670,16 @@ impl LendingPool { /// Current LP share price scaled by `SHARE_PRICE_SCALE`. /// `1_000_000` means 1.0 underlying asset per share. + /// + /// Derived from internally-tracked managed assets, so it is stable while + /// principal is out on loan and immune to direct-transfer manipulation. pub fn get_share_price(env: Env, token: Address) -> i128 { let total_shares = Self::total_shares(&env, &token); if total_shares <= 0 { return Self::SHARE_PRICE_SCALE; } - Self::read_pool_balance(&env, &token) + Self::total_managed_assets(&env, &token) .checked_mul(Self::SHARE_PRICE_SCALE) .and_then(|v| v.checked_div(total_shares)) .expect("share price overflow") @@ -644,6 +734,42 @@ impl LendingPool { Ok(()) } + /// Record `amount` of realized yield (e.g. loan interest repaid into the + /// pool), raising every outstanding share's value pro-rata. + /// + /// This is the *only* way assets enter share value besides deposits. Because + /// a contract cannot distinguish a legitimate interest repayment from an + /// unsolicited donation by looking at its balance, yield is recognised + /// through this deliberate, admin-gated call rather than by reading the raw + /// balance. That is precisely what stops a direct transfer from arbitrarily + /// changing existing holders' redeemable value (issue #2). + /// + /// Yield is not principal, so it does not move `TotalDeposits` or count + /// against the `MaxPoolSize` cap. The caller is responsible for ensuring the + /// corresponding tokens are actually present in the pool; otherwise later + /// redemptions will hit the `InsufficientLiquidity` gate. + pub fn record_yield(env: Env, token: Address, amount: i128) -> Result<(), PoolError> { + Self::admin(&env).require_auth(); + Self::assert_not_paused(&env)?; + + if amount <= 0 { + return Err(PoolError::InvalidAmount); + } + + // Yield is only meaningful once shares exist to distribute it to. + if Self::total_shares(&env, &token) <= 0 { + return Err(PoolError::InvalidAmount); + } + + let new_managed_assets = Self::total_managed_assets(&env, &token) + .checked_add(amount) + .expect("managed assets overflow"); + Self::set_total_managed_assets(&env, &token, new_managed_assets); + + yield_distributed(&env, token, amount); + Ok(()) + } + // ── Queries ─────────────────────────────────────────────────────────── pub fn get_pool_stats(env: Env, token: Address) -> PoolStats { diff --git a/lending_pool/src/test.rs b/lending_pool/src/test.rs index c3b588f..afb2a78 100644 --- a/lending_pool/src/test.rs +++ b/lending_pool/src/test.rs @@ -28,7 +28,7 @@ fn test_version_is_initialized() { let pool_client = LendingPoolClient::new(&env, &pool_id); pool_client.initialize(&admin); - assert_eq!(pool_client.version(), 3); + assert_eq!(pool_client.version(), 4); } #[test] @@ -413,10 +413,12 @@ fn test_share_price_increases_when_interest_arrives() { stellar_asset_client.mint(&provider, &1_000); pool_client.deposit(&provider, &token_id, &1_000); // 1000 shares - // Simulate loan repayment with 100 tokens of interest. + // Simulate loan repayment with 100 tokens of interest: tokens arrive in the + // pool and are recognised as realized yield via record_yield. stellar_asset_client.mint(&pool_id, &100); + pool_client.record_yield(&token_id, &100); - // Provider still holds 1000 shares; pool now has 1100 tokens. + // Provider still holds 1000 shares; managed assets now 1100. assert_eq!(pool_client.get_shares(&provider, &token_id), 1_000); assert_eq!(pool_client.get_deposit(&provider, &token_id), 1_100); } @@ -438,8 +440,9 @@ fn test_withdraw_returns_principal_plus_interest() { stellar_asset_client.mint(&provider, &1_000); pool_client.deposit(&provider, &token_id, &1_000); - // 200 tokens of interest flow back to the pool. + // 200 tokens of interest flow back to the pool and are recognised as yield. stellar_asset_client.mint(&pool_id, &200); + pool_client.record_yield(&token_id, &200); // Redeem all 1000 shares → should receive 1200 tokens (principal + yield). pool_client.withdraw(&provider, &token_id, &1_000); @@ -477,9 +480,10 @@ fn test_pro_rata_yield_distribution_on_withdrawal() { // provider_b: shares = 4_000 * 6_000 / 6_000 = 4_000 (pool=10_000, total_shares=10_000). pool_client.deposit(&provider_b, &token_id, &4_000); - // 1_000 tokens of interest paid into pool. + // 1_000 tokens of interest paid into pool and recognised as yield. stellar_asset_client.mint(&pool_id, &1_000); - // Pool: 11_000 | Shares: 10_000 + pool_client.record_yield(&token_id, &1_000); + // Managed: 11_000 | Shares: 10_000 // provider_a redeems 6_000 shares: 6_000 * 11_000 / 10_000 = 6_600 tokens. pool_client.withdraw(&provider_a, &token_id, &6_000); @@ -517,8 +521,9 @@ fn test_subsequent_depositor_does_not_dilute_existing_holders() { // provider_a deposits 1000 → 1000 shares. pool_client.deposit(&provider_a, &token_id, &1_000); - // 100 tokens of yield arrive. Pool = 1100, shares = 1000. + // 100 tokens of yield arrive and are recognised. Managed = 1100, shares = 1000. stellar_asset_client.mint(&pool_id, &100); + pool_client.record_yield(&token_id, &100); // provider_b deposits 1100 at the new exchange rate (1.1): // shares_minted = 1100 * 1000 / 1100 = 1000 shares. @@ -559,14 +564,18 @@ fn test_full_loan_cycle_with_interest() { stellar_asset_client.mint(&provider, &1_000); pool_client.deposit(&provider, &token_id, &1_000); - // 800 tokens leave the pool as a loan. + // 800 tokens leave the pool as a loan. Share value must stay at 1000 — the + // principal is still a pool asset, just temporarily out as a receivable. token_client.transfer(&pool_id, &borrower, &800); assert_eq!(token_client.balance(&pool_id), 200); + assert_eq!(pool_client.get_deposit(&provider, &token_id), 1_000); - // Borrower repays 800 principal + 80 interest = 880. + // Borrower repays 800 principal + 80 interest = 880; the 80 interest is + // recognised as realized yield. stellar_asset_client.mint(&borrower, &80); token_client.transfer(&borrower, &pool_id, &880); assert_eq!(token_client.balance(&pool_id), 1_080); + pool_client.record_yield(&token_id, &80); // Provider redeems all 1000 shares → 1080 (principal + interest). pool_client.withdraw(&provider, &token_id, &1_000); @@ -638,6 +647,7 @@ fn test_many_depositors_receive_proportional_yield() { } stellar_asset_client.mint(&pool_id, &600); + pool_client.record_yield(&token_id, &600); for (provider, shares) in &depositors { pool_client.withdraw(provider, &token_id, shares); @@ -1034,9 +1044,10 @@ fn test_get_depositor_yield_reflects_accrued_interest() { assert_eq!(shares, 1000); assert_eq!(asset_value, 1000); - // Simulate interest repaid into the pool (increases pool balance without - // minting new shares, so each share is now worth more). + // Simulate interest repaid into the pool and recognised as yield (raises + // managed assets without minting new shares, so each share is worth more). stellar_asset_client.mint(&pool_id, &200); + pool_client.record_yield(&token_id, &200); let (shares2, asset_value2) = pool_client.get_depositor_yield(&provider, &token_id); assert_eq!(shares2, 1000); @@ -1168,11 +1179,23 @@ fn test_withdrawal_with_utilization() { let stats = pool_client.get_pool_stats(&token_id); assert_eq!(stats.utilization_bps, 8000); - // If user tries to withdraw 500 shares, they only get 100 tokens - // because share value is based on liquid balance. - // assets = shares * pool_balance / total_shares = 500 * 200 / 1000 = 100 - pool_client.withdraw(&provider, &token_id, &500); + // Share value is NOT discounted by the outstanding loan: each share is still + // worth 1.0 because the lent principal remains a pool asset (issue #2). + assert_eq!(pool_client.get_share_price(&token_id), 1_000_000); + + // A redemption larger than the on-hand balance cannot be serviced and is + // rejected with InsufficientLiquidity rather than being mis-priced. + // 500 shares → 500 assets, but only 200 tokens are liquid. + let res = pool_client.try_withdraw(&provider, &token_id, &500); + assert_eq!(res, Err(Ok(crate::PoolError::InsufficientLiquidity))); + + // A redemption that fits within the liquid balance returns full value: + // 100 shares → 100 assets (not discounted by utilisation). + pool_client.withdraw(&provider, &token_id, &100); assert_eq!(token_client.balance(&provider), 100); + assert_eq!(token_client.balance(&pool_id), 100); + // Principal tracking stays exact: 1000 − 100 = 900. + assert_eq!(pool_client.get_total_deposits(&token_id), 900); } #[test] @@ -1342,9 +1365,10 @@ fn test_share_price_rises_proportionally_with_yield() { stellar_asset_client.mint(&provider, &2_000); pool_client.deposit(&provider, &token_id, &2_000); // 2000 shares - // 500 tokens of interest arrive (25 % yield). + // 500 tokens of interest arrive (25 % yield) and are recognised. stellar_asset_client.mint(&pool_id, &500); - // Pool: 2500 | Shares: 2000 → price = 2500 * 1_000_000 / 2000 = 1_250_000. + pool_client.record_yield(&token_id, &500); + // Managed: 2500 | Shares: 2000 → price = 2500 * 1_000_000 / 2000 = 1_250_000. let share_price = pool_client.get_share_price(&token_id); assert_eq!(share_price, 1_250_000); @@ -1384,9 +1408,10 @@ fn test_multiple_depositors_share_yield_proportionally_and_total_shares_track_co assert_eq!(pool_client.get_total_shares(&token_id), 10_000); - // 1000 tokens of interest arrive (10 % yield). + // 1000 tokens of interest arrive (10 % yield) and are recognised. stellar_asset_client.mint(&pool_id, &1_000); - // Pool: 11000 | Shares: 10000 + pool_client.record_yield(&token_id, &1_000); + // Managed: 11000 | Shares: 10000 // Each provider redeems all shares. // p1: 5000 * 11000 / 10000 = 5500 (pool=11000, shares=10000) @@ -1451,14 +1476,14 @@ fn test_cap_below_current_deposits_blocks_deposits_but_allows_withdrawals() { #[test] fn test_donation_attack_does_not_zero_out_subsequent_depositor() { // Attacker tries the classic ERC-4626 inflation attack: mint as little as - // possible, donate a large amount directly to the pool to push the share - // price up, then watch the victim's deposit either round to zero shares - // or net the attacker the victim's principal on redeem. + // possible, donate a large amount directly to the pool, then watch the + // victim's deposit round to zero shares or net the attacker the victim's + // principal on redeem. // - // With the MINIMUM_INITIAL_DEPOSIT guard (issue #1) the attacker can no - // longer mint a 1-share token-cost foothold — the first deposit of <1_000 - // is rejected outright — and an honest second depositor receives fair - // shares that redeem back to (at least) their original principal. + // Two independent defenses apply: the MINIMUM_INITIAL_DEPOSIT guard + // (issue #1) rejects the 1-stroop foothold, and managed-asset accounting + // (issue #2) means the donation never moves the share price at all, so the + // honest depositor mints fair shares and redeems their full principal. let env = Env::default(); env.mock_all_auths(); @@ -1481,26 +1506,204 @@ fn test_donation_attack_does_not_zero_out_subsequent_depositor() { // The attacker is forced to commit at least MINIMUM_INITIAL_DEPOSIT. pool_client.deposit(&attacker, &token_id, &1_000); - // Then donates 1_000_000 tokens directly to the contract to inflate + // Then donates 1_000_000 tokens directly to the contract to try to inflate // the share price. stellar_asset_client.mint(&pool_id, &1_000_000); - // Honest second depositor: with cur_total_shares = 1_000 and - // total_assets = 1_001_000, depositing 100_000 mints - // 100_000 * 1_000 / 1_001_000 ≈ 99 shares, not zero. + // Managed-asset accounting ignores the donation, so the honest depositor + // mints shares at the true 1:1 rate (100_000 * 1_000 / 1_000) rather than a + // rounded-down zero. pool_client.deposit(&victim, &token_id, &100_000); let victim_shares = pool_client.get_shares(&victim, &token_id); - assert!( - victim_shares > 0, - "honest second deposit must mint a non-zero share count" + assert_eq!( + victim_shares, 100_000, + "honest second deposit must mint fair shares" ); - // The victim can redeem their shares for ~their principal back — they - // are not wiped out, even though the attacker has poisoned the price. + // The victim redeems their shares for their full principal back — the + // donation cannot siphon it. pool_client.withdraw(&victim, &token_id, &victim_shares); - let victim_wallet = token_client.balance(&victim); - assert!( - victim_wallet >= 900_000 + (victim_shares * 1_001_000) / 1_000 - 5, - "victim should recover their share of the pool" - ); + assert_eq!(token_client.balance(&victim), 1_000_000); +} + +// ── Manipulation-resistant accounting (issue #2) ────────────────────────────── + +#[test] +fn test_direct_transfer_does_not_change_redeemable_value() { + // An unsolicited direct token transfer to the pool address must NOT change + // existing holders' redeemable value or the share price. The donated tokens + // simply sit as un-counted surplus until an authorized record_yield call. + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let (token_id, stellar_asset_client, token_client) = create_token_contract(&env, &token_admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + pool_client.initialize(&token_admin); + pool_client.set_withdrawal_cooldown(&0); + + let provider = Address::generate(&env); + stellar_asset_client.mint(&provider, &1_000); + pool_client.deposit(&provider, &token_id, &1_000); + + // Baseline: 1 share == 1 asset. + assert_eq!(pool_client.get_share_price(&token_id), 1_000_000); + assert_eq!(pool_client.get_deposit(&provider, &token_id), 1_000); + + // An attacker dumps 10_000 tokens straight into the pool address. + let attacker = Address::generate(&env); + stellar_asset_client.mint(&attacker, &10_000); + token_client.transfer(&attacker, &pool_id, &10_000); + + // Raw balance ballooned, but managed assets / share price are untouched. + assert_eq!(token_client.balance(&pool_id), 11_000); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 1_000); + assert_eq!(pool_client.get_share_price(&token_id), 1_000_000); + assert_eq!(pool_client.get_deposit(&provider, &token_id), 1_000); + + // Redeeming returns exactly the tracked value (1000), not the inflated balance. + pool_client.withdraw(&provider, &token_id, &1_000); + assert_eq!(token_client.balance(&provider), 1_000); + // The donated surplus remains in the pool, unattributed to any share. + assert_eq!(token_client.balance(&pool_id), 10_000); +} + +#[test] +fn test_deposit_and_redeem_while_loan_outstanding() { + // Deposits and redemptions while principal is out on loan must price off the + // stable managed-asset base, and redemptions beyond the on-hand balance are + // gated rather than mis-priced. + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let (token_id, stellar_asset_client, token_client) = create_token_contract(&env, &token_admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + pool_client.initialize(&token_admin); + pool_client.set_withdrawal_cooldown(&0); + + let provider_a = Address::generate(&env); + let provider_b = Address::generate(&env); + let borrower = Address::generate(&env); + stellar_asset_client.mint(&provider_a, &1_000); + stellar_asset_client.mint(&provider_b, &1_000); + + pool_client.deposit(&provider_a, &token_id, &1_000); // 1000 shares, managed 1000 + + // 600 tokens go out as a loan; share price is unchanged. + token_client.transfer(&pool_id, &borrower, &600); + assert_eq!(token_client.balance(&pool_id), 400); + assert_eq!(pool_client.get_share_price(&token_id), 1_000_000); + + // provider_b deposits while the loan is outstanding and gets a fair 1:1 rate + // (1000 * 1000 / 1000), unaffected by the depleted balance. + pool_client.deposit(&provider_b, &token_id, &1_000); + assert_eq!(pool_client.get_shares(&provider_b, &token_id), 1_000); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 2_000); + + // Liquid balance is 1400; a 2000-asset redemption cannot be serviced. + let res = pool_client.try_withdraw(&provider_a, &token_id, &1_000); + // provider_a's 1000 shares == 1000 assets, which fits in 1400 liquid. + assert!(res.is_ok()); + assert_eq!(token_client.balance(&provider_a), 1_000); + assert_eq!(token_client.balance(&pool_id), 400); + + // provider_b now wants 1000 assets but only 400 are liquid → gated. + let res = pool_client.try_withdraw(&provider_b, &token_id, &1_000); + assert_eq!(res, Err(Ok(crate::PoolError::InsufficientLiquidity))); + + // Borrower repays principal (no interest); provider_b can now exit at par. + token_client.transfer(&borrower, &pool_id, &600); + pool_client.withdraw(&provider_b, &token_id, &1_000); + assert_eq!(token_client.balance(&provider_b), 1_000); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 0); +} + +#[test] +fn test_total_deposits_tracks_principal_after_yield_then_redeem() { + // Acceptance criterion 4: redeeming shares whose value includes yield must + // reduce TotalDeposits by the principal portion only, so it keeps tracking + // net principal and never drifts. + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let (token_id, stellar_asset_client, token_client) = create_token_contract(&env, &token_admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + pool_client.initialize(&token_admin); + pool_client.set_withdrawal_cooldown(&0); + + let provider = Address::generate(&env); + stellar_asset_client.mint(&provider, &1_000); + pool_client.deposit(&provider, &token_id, &1_000); + + // 500 of recognised yield arrives. Managed = 1500, principal still 1000. + stellar_asset_client.mint(&pool_id, &500); + pool_client.record_yield(&token_id, &500); + assert_eq!(pool_client.get_total_deposits(&token_id), 1_000); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 1_500); + + // Redeem half the shares: payout = 500 * 1500 / 1000 = 750 (250 of it yield). + pool_client.withdraw(&provider, &token_id, &500); + assert_eq!(token_client.balance(&provider), 750); + + // TotalDeposits drops by the 500 principal portion only (not by 750). + assert_eq!(pool_client.get_total_deposits(&token_id), 500); + // Managed assets drop by the full 750 payout. + assert_eq!(pool_client.get_total_managed_assets(&token_id), 750); +} + +#[test] +fn test_record_yield_requires_admin() { + let env = Env::default(); + + let admin = Address::generate(&env); + let (token_id, stellar_asset_client, _token_client) = create_token_contract(&env, &admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + + env.mock_all_auths(); + pool_client.initialize(&admin); + pool_client.set_withdrawal_cooldown(&0); + + let provider = Address::generate(&env); + stellar_asset_client.mint(&provider, &1_000); + pool_client.deposit(&provider, &token_id, &1_000); + + // A non-admin caller cannot fold yield into share value. + let attacker = Address::generate(&env); + env.mock_auths(&[soroban_sdk::testutils::MockAuth { + address: &attacker, + invoke: &soroban_sdk::testutils::MockAuthInvoke { + contract: &pool_id, + fn_name: "record_yield", + args: (token_id.clone(), 100i128).into_val(&env), + sub_invokes: &[], + }, + }]); + assert!(pool_client.try_record_yield(&token_id, &100).is_err()); +} + +#[test] +fn test_record_yield_rejected_when_no_shares_outstanding() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let (token_id, _stellar_asset_client, _token_client) = create_token_contract(&env, &admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + pool_client.initialize(&admin); + + // No deposits yet → no shares to attribute yield to. + let res = pool_client.try_record_yield(&token_id, &100); + assert_eq!(res, Err(Ok(crate::PoolError::InvalidAmount))); } diff --git a/lending_pool/test_snapshots/test/test_accept_admin_flow.1.json b/lending_pool/test_snapshots/test/test_accept_admin_flow.1.json index 9dda81b..810a555 100644 --- a/lending_pool/test_snapshots/test/test_accept_admin_flow.1.json +++ b/lending_pool/test_snapshots/test/test_accept_admin_flow.1.json @@ -209,7 +209,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_accept_admin_with_no_proposed_returns_error.1.json b/lending_pool/test_snapshots/test/test_accept_admin_with_no_proposed_returns_error.1.json index f395807..d991d24 100644 --- a/lending_pool/test_snapshots/test/test_accept_admin_with_no_proposed_returns_error.1.json +++ b/lending_pool/test_snapshots/test/test_accept_admin_with_no_proposed_returns_error.1.json @@ -74,7 +74,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_admin_transfer_flow.1.json b/lending_pool/test_snapshots/test/test_admin_transfer_flow.1.json index a89f701..43fd000 100644 --- a/lending_pool/test_snapshots/test/test_admin_transfer_flow.1.json +++ b/lending_pool/test_snapshots/test/test_admin_transfer_flow.1.json @@ -193,7 +193,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_cap_below_current_deposits_blocks_deposits_but_allows_withdrawals.1.json b/lending_pool/test_snapshots/test/test_cap_below_current_deposits_blocks_deposits_but_allows_withdrawals.1.json index 64c761c..d3f6543 100644 --- a/lending_pool/test_snapshots/test/test_cap_below_current_deposits_blocks_deposits_but_allows_withdrawals.1.json +++ b/lending_pool/test_snapshots/test/test_cap_below_current_deposits_blocks_deposits_but_allows_withdrawals.1.json @@ -767,6 +767,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, { "key": { "vec": [ @@ -794,7 +812,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_after_withdraw_frees_cap_space.1.json b/lending_pool/test_snapshots/test/test_deposit_after_withdraw_frees_cap_space.1.json index 6425171..be9833e 100644 --- a/lending_pool/test_snapshots/test/test_deposit_after_withdraw_frees_cap_space.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_after_withdraw_frees_cap_space.1.json @@ -659,6 +659,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, { "key": { "vec": [ @@ -686,7 +704,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_and_redeem_while_loan_outstanding.1.json b/lending_pool/test_snapshots/test/test_deposit_and_redeem_while_loan_outstanding.1.json new file mode 100644 index 0000000..34ac54b --- /dev/null +++ b/lending_pool/test_snapshots/test/test_deposit_and_redeem_while_loan_outstanding.1.json @@ -0,0 +1,1269 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DepositorCount" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_deposit_at_max_cap_edge_cases.1.json b/lending_pool/test_snapshots/test/test_deposit_at_max_cap_edge_cases.1.json index 25b300d..2507ce3 100644 --- a/lending_pool/test_snapshots/test/test_deposit_at_max_cap_edge_cases.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_at_max_cap_edge_cases.1.json @@ -470,6 +470,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, { "key": { "vec": [ @@ -497,7 +515,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_blocked_when_paused.1.json b/lending_pool/test_snapshots/test/test_deposit_blocked_when_paused.1.json index 5f2895c..e8d3a98 100644 --- a/lending_pool/test_snapshots/test/test_deposit_blocked_when_paused.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_blocked_when_paused.1.json @@ -310,7 +310,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_event_emission.1.json b/lending_pool/test_snapshots/test/test_deposit_event_emission.1.json index 76ca191..9ab5ad9 100644 --- a/lending_pool/test_snapshots/test/test_deposit_event_emission.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_event_emission.1.json @@ -444,6 +444,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, { "key": { "vec": [ @@ -471,7 +489,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_exceeds_cap_panics.1.json b/lending_pool/test_snapshots/test/test_deposit_exceeds_cap_panics.1.json index 8b7a214..db058e1 100644 --- a/lending_pool/test_snapshots/test/test_deposit_exceeds_cap_panics.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_exceeds_cap_panics.1.json @@ -288,7 +288,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_flow.1.json b/lending_pool/test_snapshots/test/test_deposit_flow.1.json index 8c067f6..9f095f2 100644 --- a/lending_pool/test_snapshots/test/test_deposit_flow.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_flow.1.json @@ -450,6 +450,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, { "key": { "vec": [ @@ -477,7 +495,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_unauthorized.1.json b/lending_pool/test_snapshots/test/test_deposit_unauthorized.1.json index b8187ac..c4ee44d 100644 --- a/lending_pool/test_snapshots/test/test_deposit_unauthorized.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_unauthorized.1.json @@ -270,7 +270,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.1.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.1.json index a474578..6f26c8f 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.1.json @@ -369,6 +369,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "vec": [ @@ -396,7 +414,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.2.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.2.json index f364ff1..cfbaf57 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.2.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.2.json @@ -474,6 +474,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1099 + } + } + }, { "key": { "vec": [ @@ -501,7 +519,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.3.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.3.json index f7c609f..ed920e6 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.3.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.3.json @@ -474,6 +474,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 750 + } + } + }, { "key": { "vec": [ @@ -501,7 +519,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.4.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.4.json index d13f460..505168d 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.4.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.4.json @@ -474,6 +474,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, { "key": { "vec": [ @@ -501,7 +519,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.5.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.5.json index d3dc379..1151df6 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.5.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.5.json @@ -474,6 +474,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, { "key": { "vec": [ @@ -501,7 +519,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.6.json b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.6.json index d3dc379..1151df6 100644 --- a/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.6.json +++ b/lending_pool/test_snapshots/test/test_deposit_withdraw_invariants.6.json @@ -474,6 +474,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, { "key": { "vec": [ @@ -501,7 +519,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_deposit_within_cap_succeeds.1.json b/lending_pool/test_snapshots/test/test_deposit_within_cap_succeeds.1.json index 5160f4e..f2b75dc 100644 --- a/lending_pool/test_snapshots/test/test_deposit_within_cap_succeeds.1.json +++ b/lending_pool/test_snapshots/test/test_deposit_within_cap_succeeds.1.json @@ -522,6 +522,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, { "key": { "vec": [ @@ -549,7 +567,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_direct_transfer_does_not_change_redeemable_value.1.json b/lending_pool/test_snapshots/test/test_direct_transfer_does_not_change_redeemable_value.1.json new file mode 100644 index 0000000..676e5f3 --- /dev/null +++ b/lending_pool/test_snapshots/test/test_direct_transfer_does_not_change_redeemable_value.1.json @@ -0,0 +1,988 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DepositorCount" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_donation_attack_does_not_zero_out_subsequent_depositor.1.json b/lending_pool/test_snapshots/test/test_donation_attack_does_not_zero_out_subsequent_depositor.1.json index d66ba64..be3a808 100644 --- a/lending_pool/test_snapshots/test/test_donation_attack_does_not_zero_out_subsequent_depositor.1.json +++ b/lending_pool/test_snapshots/test/test_donation_attack_does_not_zero_out_subsequent_depositor.1.json @@ -243,7 +243,7 @@ { "i128": { "hi": 0, - "lo": 99 + "lo": 100000 } } ] @@ -639,7 +639,25 @@ "val": { "i128": { "hi": 0, - "lo": 1820 + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 } } }, @@ -670,7 +688,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -838,7 +856,7 @@ "val": { "i128": { "hi": 0, - "lo": 1001820 + "lo": 1001000 } } }, @@ -984,7 +1002,7 @@ "val": { "i128": { "hi": 0, - "lo": 999180 + "lo": 1000000 } } }, diff --git a/lending_pool/test_snapshots/test/test_double_initialize_returns_error.1.json b/lending_pool/test_snapshots/test/test_double_initialize_returns_error.1.json index f395807..d991d24 100644 --- a/lending_pool/test_snapshots/test/test_double_initialize_returns_error.1.json +++ b/lending_pool/test_snapshots/test/test_double_initialize_returns_error.1.json @@ -74,7 +74,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_emergency_withdraw_allowed_while_paused_bypasses_cooldown.1.json b/lending_pool/test_snapshots/test/test_emergency_withdraw_allowed_while_paused_bypasses_cooldown.1.json index bac3212..9384c51 100644 --- a/lending_pool/test_snapshots/test/test_emergency_withdraw_allowed_while_paused_bypasses_cooldown.1.json +++ b/lending_pool/test_snapshots/test/test_emergency_withdraw_allowed_while_paused_bypasses_cooldown.1.json @@ -417,6 +417,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "vec": [ @@ -444,7 +462,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_emergency_withdraw_emits_distinct_event.1.json b/lending_pool/test_snapshots/test/test_emergency_withdraw_emits_distinct_event.1.json index 6506491..aa6e8dd 100644 --- a/lending_pool/test_snapshots/test/test_emergency_withdraw_emits_distinct_event.1.json +++ b/lending_pool/test_snapshots/test/test_emergency_withdraw_emits_distinct_event.1.json @@ -415,6 +415,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "vec": [ @@ -442,7 +460,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_emergency_withdraw_rejected_when_not_paused.1.json b/lending_pool/test_snapshots/test/test_emergency_withdraw_rejected_when_not_paused.1.json index a17b1cf..85966de 100644 --- a/lending_pool/test_snapshots/test/test_emergency_withdraw_rejected_when_not_paused.1.json +++ b/lending_pool/test_snapshots/test/test_emergency_withdraw_rejected_when_not_paused.1.json @@ -447,6 +447,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1500 + } + } + }, { "key": { "vec": [ @@ -474,7 +492,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_full_loan_cycle_with_interest.1.json b/lending_pool/test_snapshots/test/test_full_loan_cycle_with_interest.1.json index 0d989e3..7cb39c0 100644 --- a/lending_pool/test_snapshots/test/test_full_loan_cycle_with_interest.1.json +++ b/lending_pool/test_snapshots/test/test_full_loan_cycle_with_interest.1.json @@ -150,6 +150,7 @@ ] ], [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", @@ -204,6 +205,31 @@ ] ], [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 80 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -405,6 +431,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -480,8 +539,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709551536 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -512,7 +589,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -609,7 +686,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary" @@ -624,7 +701,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_get_admin_returns_initialized_admin.1.json b/lending_pool/test_snapshots/test/test_get_admin_returns_initialized_admin.1.json index f395807..d991d24 100644 --- a/lending_pool/test_snapshots/test/test_get_admin_returns_initialized_admin.1.json +++ b/lending_pool/test_snapshots/test/test_get_admin_returns_initialized_admin.1.json @@ -74,7 +74,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_get_depositor_yield_no_deposit.1.json b/lending_pool/test_snapshots/test/test_get_depositor_yield_no_deposit.1.json index acf3bdc..5a23530 100644 --- a/lending_pool/test_snapshots/test/test_get_depositor_yield_no_deposit.1.json +++ b/lending_pool/test_snapshots/test/test_get_depositor_yield_no_deposit.1.json @@ -154,7 +154,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_get_depositor_yield_reflects_accrued_interest.1.json b/lending_pool/test_snapshots/test/test_get_depositor_yield_reflects_accrued_interest.1.json index 4809d47..0f84741 100644 --- a/lending_pool/test_snapshots/test/test_get_depositor_yield_reflects_accrued_interest.1.json +++ b/lending_pool/test_snapshots/test/test_get_depositor_yield_reflects_accrued_interest.1.json @@ -147,6 +147,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [] ], "ledger": { @@ -286,6 +311,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -504,6 +562,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1200 + } + } + }, { "key": { "vec": [ @@ -531,7 +607,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_immediate_withdraw_panics_when_cooldown_active.1.json b/lending_pool/test_snapshots/test/test_immediate_withdraw_panics_when_cooldown_active.1.json index 02f5538..92ee6bd 100644 --- a/lending_pool/test_snapshots/test/test_immediate_withdraw_panics_when_cooldown_active.1.json +++ b/lending_pool/test_snapshots/test/test_immediate_withdraw_panics_when_cooldown_active.1.json @@ -393,6 +393,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, { "key": { "vec": [ @@ -420,7 +438,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json b/lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json new file mode 100644 index 0000000..66b6617 --- /dev/null +++ b/lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json @@ -0,0 +1,1173 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 10001 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DepositorCount" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10001 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_insufficient_balance_withdraw_panic.1.json b/lending_pool/test_snapshots/test/test_insufficient_balance_withdraw_panic.1.json index 0d5da48..dfd09e6 100644 --- a/lending_pool/test_snapshots/test/test_insufficient_balance_withdraw_panic.1.json +++ b/lending_pool/test_snapshots/test/test_insufficient_balance_withdraw_panic.1.json @@ -445,6 +445,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, { "key": { "vec": [ @@ -472,7 +490,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_many_depositors_receive_proportional_yield.1.json b/lending_pool/test_snapshots/test/test_many_depositors_receive_proportional_yield.1.json index b74d685..0073e30 100644 --- a/lending_pool/test_snapshots/test/test_many_depositors_receive_proportional_yield.1.json +++ b/lending_pool/test_snapshots/test/test_many_depositors_receive_proportional_yield.1.json @@ -300,6 +300,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -493,6 +518,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -700,8 +758,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709551016 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -732,7 +808,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -763,7 +839,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary" @@ -778,7 +854,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary", @@ -829,7 +905,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 3126073502131104533 } }, "durability": "temporary" @@ -844,7 +920,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 3126073502131104533 } }, "durability": "temporary", @@ -895,7 +971,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary" @@ -910,7 +986,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_multiple_depositors_share_yield_proportionally_and_total_shares_track_correctly.1.json b/lending_pool/test_snapshots/test/test_multiple_depositors_share_yield_proportionally_and_total_shares_track_correctly.1.json index 81615bd..ca6891a 100644 --- a/lending_pool/test_snapshots/test/test_multiple_depositors_share_yield_proportionally_and_total_shares_track_correctly.1.json +++ b/lending_pool/test_snapshots/test/test_multiple_depositors_share_yield_proportionally_and_total_shares_track_correctly.1.json @@ -301,6 +301,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -495,6 +520,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -702,8 +760,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709550616 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -734,7 +810,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -765,7 +841,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary" @@ -780,7 +856,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary", @@ -831,7 +907,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 3126073502131104533 } }, "durability": "temporary" @@ -846,7 +922,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 3126073502131104533 } }, "durability": "temporary", @@ -897,7 +973,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary" @@ -912,7 +988,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_multiple_tokens_independence.1.json b/lending_pool/test_snapshots/test/test_multiple_tokens_independence.1.json index 90b6370..d1a9b81 100644 --- a/lending_pool/test_snapshots/test/test_multiple_tokens_independence.1.json +++ b/lending_pool/test_snapshots/test/test_multiple_tokens_independence.1.json @@ -778,6 +778,42 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBUSYNQKASUYFWYC3M2GUEDMX4AIVWPALDBYJPNK6554BREHTGZ2IUNF" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, { "key": { "vec": [ @@ -823,7 +859,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_negative_deposit_panic.1.json b/lending_pool/test_snapshots/test/test_negative_deposit_panic.1.json index 4975998..d8a3898 100644 --- a/lending_pool/test_snapshots/test/test_negative_deposit_panic.1.json +++ b/lending_pool/test_snapshots/test/test_negative_deposit_panic.1.json @@ -206,7 +206,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_negative_withdraw_panic.1.json b/lending_pool/test_snapshots/test/test_negative_withdraw_panic.1.json index 4975998..d8a3898 100644 --- a/lending_pool/test_snapshots/test/test_negative_withdraw_panic.1.json +++ b/lending_pool/test_snapshots/test/test_negative_withdraw_panic.1.json @@ -206,7 +206,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_no_cap_allows_unlimited_deposits.1.json b/lending_pool/test_snapshots/test/test_no_cap_allows_unlimited_deposits.1.json index 2a3b517..d68930f 100644 --- a/lending_pool/test_snapshots/test/test_no_cap_allows_unlimited_deposits.1.json +++ b/lending_pool/test_snapshots/test/test_no_cap_allows_unlimited_deposits.1.json @@ -445,6 +445,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + }, { "key": { "vec": [ @@ -472,7 +490,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_pool_stats.1.json b/lending_pool/test_snapshots/test/test_pool_stats.1.json index bf68692..9589397 100644 --- a/lending_pool/test_snapshots/test/test_pool_stats.1.json +++ b/lending_pool/test_snapshots/test/test_pool_stats.1.json @@ -567,6 +567,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "vec": [ @@ -594,7 +612,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_pool_stats_reflect_funds_allocated_and_returned.1.json b/lending_pool/test_snapshots/test/test_pool_stats_reflect_funds_allocated_and_returned.1.json index 3750ef7..8797c6f 100644 --- a/lending_pool/test_snapshots/test/test_pool_stats_reflect_funds_allocated_and_returned.1.json +++ b/lending_pool/test_snapshots/test/test_pool_stats_reflect_funds_allocated_and_returned.1.json @@ -561,6 +561,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, { "key": { "vec": [ @@ -588,7 +606,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_pro_rata_yield_distribution_on_withdrawal.1.json b/lending_pool/test_snapshots/test/test_pro_rata_yield_distribution_on_withdrawal.1.json index ca38c42..0b6c66b 100644 --- a/lending_pool/test_snapshots/test/test_pro_rata_yield_distribution_on_withdrawal.1.json +++ b/lending_pool/test_snapshots/test/test_pro_rata_yield_distribution_on_withdrawal.1.json @@ -223,6 +223,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -453,6 +478,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -561,8 +619,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709550616 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -593,7 +669,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -657,7 +733,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary" @@ -672,7 +748,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary", @@ -690,7 +766,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -705,7 +781,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -723,7 +799,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 4270020994084947596 } }, "durability": "temporary" @@ -738,7 +814,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 4270020994084947596 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_record_yield_rejected_when_no_shares_outstanding.1.json b/lending_pool/test_snapshots/test/test_record_yield_rejected_when_no_shares_outstanding.1.json new file mode 100644 index 0000000..15d3ee4 --- /dev/null +++ b/lending_pool/test_snapshots/test/test_record_yield_rejected_when_no_shares_outstanding.1.json @@ -0,0 +1,318 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 1440 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_record_yield_requires_admin.1.json b/lending_pool/test_snapshots/test/test_record_yield_requires_admin.1.json new file mode 100644 index 0000000..78e81ed --- /dev/null +++ b/lending_pool/test_snapshots/test/test_record_yield_requires_admin.1.json @@ -0,0 +1,866 @@ +{ + "generators": { + "address": 5, + "nonce": 1 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DepositorCount" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json b/lending_pool/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json index 7d3f737..765274f 100644 --- a/lending_pool/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json +++ b/lending_pool/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json @@ -126,7 +126,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_set_and_get_max_pool_size.1.json b/lending_pool/test_snapshots/test/test_set_and_get_max_pool_size.1.json index a4d0a49..f7041c2 100644 --- a/lending_pool/test_snapshots/test/test_set_and_get_max_pool_size.1.json +++ b/lending_pool/test_snapshots/test/test_set_and_get_max_pool_size.1.json @@ -283,7 +283,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_set_max_pool_size_unauthorized.1.json b/lending_pool/test_snapshots/test/test_set_max_pool_size_unauthorized.1.json index 0037463..112ca9c 100644 --- a/lending_pool/test_snapshots/test/test_set_max_pool_size_unauthorized.1.json +++ b/lending_pool/test_snapshots/test/test_set_max_pool_size_unauthorized.1.json @@ -187,7 +187,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_set_negative_max_pool_size_panics.1.json b/lending_pool/test_snapshots/test/test_set_negative_max_pool_size_panics.1.json index 4d507d8..15d3ee4 100644 --- a/lending_pool/test_snapshots/test/test_set_negative_max_pool_size_panics.1.json +++ b/lending_pool/test_snapshots/test/test_set_negative_max_pool_size_panics.1.json @@ -154,7 +154,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_set_withdrawal_cooldown_rejects_values_above_maximum.1.json b/lending_pool/test_snapshots/test/test_set_withdrawal_cooldown_rejects_values_above_maximum.1.json index fb13147..d906a6a 100644 --- a/lending_pool/test_snapshots/test/test_set_withdrawal_cooldown_rejects_values_above_maximum.1.json +++ b/lending_pool/test_snapshots/test/test_set_withdrawal_cooldown_rejects_values_above_maximum.1.json @@ -75,7 +75,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_share_price_increases_when_interest_arrives.1.json b/lending_pool/test_snapshots/test/test_share_price_increases_when_interest_arrives.1.json index 75b7f92..37dbe55 100644 --- a/lending_pool/test_snapshots/test/test_share_price_increases_when_interest_arrives.1.json +++ b/lending_pool/test_snapshots/test/test_share_price_increases_when_interest_arrives.1.json @@ -146,6 +146,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [], [] ], @@ -286,6 +311,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -504,6 +562,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1100 + } + } + }, { "key": { "vec": [ @@ -531,7 +607,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_share_price_is_one_to_one_before_any_yield.1.json b/lending_pool/test_snapshots/test/test_share_price_is_one_to_one_before_any_yield.1.json index e8732f5..0c732c2 100644 --- a/lending_pool/test_snapshots/test/test_share_price_is_one_to_one_before_any_yield.1.json +++ b/lending_pool/test_snapshots/test/test_share_price_is_one_to_one_before_any_yield.1.json @@ -447,6 +447,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, { "key": { "vec": [ @@ -474,7 +492,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_share_price_rises_proportionally_with_yield.1.json b/lending_pool/test_snapshots/test/test_share_price_rises_proportionally_with_yield.1.json index e3927af..f591a05 100644 --- a/lending_pool/test_snapshots/test/test_share_price_rises_proportionally_with_yield.1.json +++ b/lending_pool/test_snapshots/test/test_share_price_rises_proportionally_with_yield.1.json @@ -146,6 +146,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [], [ [ @@ -315,6 +340,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -529,7 +587,25 @@ "val": { "i128": { "hi": 0, - "lo": 750 + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1250 } } }, @@ -560,7 +636,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -591,7 +667,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary" @@ -606,7 +682,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -624,7 +700,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary" @@ -639,7 +715,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_subsequent_depositor_does_not_dilute_existing_holders.1.json b/lending_pool/test_snapshots/test/test_subsequent_depositor_does_not_dilute_existing_holders.1.json index b0a0663..9b561d8 100644 --- a/lending_pool/test_snapshots/test/test_subsequent_depositor_does_not_dilute_existing_holders.1.json +++ b/lending_pool/test_snapshots/test/test_subsequent_depositor_does_not_dilute_existing_holders.1.json @@ -171,6 +171,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", @@ -488,6 +513,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -563,8 +621,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709551516 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -595,7 +671,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -659,7 +735,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary" @@ -674,7 +750,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary", @@ -692,7 +768,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -707,7 +783,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -725,7 +801,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 6277191135259896685 } }, "durability": "temporary" @@ -740,7 +816,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 6277191135259896685 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_total_deposits_tracks_principal_after_yield_then_redeem.1.json b/lending_pool/test_snapshots/test/test_total_deposits_tracks_principal_after_yield_then_redeem.1.json new file mode 100644 index 0000000..9ccefbc --- /dev/null +++ b/lending_pool/test_snapshots/test/test_total_deposits_tracks_principal_after_yield_then_redeem.1.json @@ -0,0 +1,1014 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "withdraw", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "DepositorCount" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 750 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 750 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 750 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/lending_pool/test_snapshots/test/test_unauthorized_admin_actions.1.json b/lending_pool/test_snapshots/test/test_unauthorized_admin_actions.1.json index 669c603..4f38696 100644 --- a/lending_pool/test_snapshots/test/test_unauthorized_admin_actions.1.json +++ b/lending_pool/test_snapshots/test/test_unauthorized_admin_actions.1.json @@ -113,7 +113,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_upgrade_requires_admin_auth.1.json b/lending_pool/test_snapshots/test/test_upgrade_requires_admin_auth.1.json index f395807..d991d24 100644 --- a/lending_pool/test_snapshots/test/test_upgrade_requires_admin_auth.1.json +++ b/lending_pool/test_snapshots/test/test_upgrade_requires_admin_auth.1.json @@ -74,7 +74,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_version_is_initialized.1.json b/lending_pool/test_snapshots/test/test_version_is_initialized.1.json index f395807..d991d24 100644 --- a/lending_pool/test_snapshots/test/test_version_is_initialized.1.json +++ b/lending_pool/test_snapshots/test/test_version_is_initialized.1.json @@ -74,7 +74,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_withdraw_blocked_when_paused.1.json b/lending_pool/test_snapshots/test/test_withdraw_blocked_when_paused.1.json index 3f18e62..a9f6480 100644 --- a/lending_pool/test_snapshots/test/test_withdraw_blocked_when_paused.1.json +++ b/lending_pool/test_snapshots/test/test_withdraw_blocked_when_paused.1.json @@ -493,6 +493,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, { "key": { "vec": [ @@ -520,7 +538,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_withdraw_flow.1.json b/lending_pool/test_snapshots/test/test_withdraw_flow.1.json index 356ab65..dda3ce0 100644 --- a/lending_pool/test_snapshots/test/test_withdraw_flow.1.json +++ b/lending_pool/test_snapshots/test/test_withdraw_flow.1.json @@ -480,6 +480,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, { "key": { "vec": [ @@ -507,7 +525,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_withdraw_reduces_total_deposits.1.json b/lending_pool/test_snapshots/test/test_withdraw_reduces_total_deposits.1.json index f505469..737c7bd 100644 --- a/lending_pool/test_snapshots/test/test_withdraw_reduces_total_deposits.1.json +++ b/lending_pool/test_snapshots/test/test_withdraw_reduces_total_deposits.1.json @@ -550,6 +550,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, { "key": { "vec": [ @@ -577,7 +595,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_withdraw_returns_principal_plus_interest.1.json b/lending_pool/test_snapshots/test/test_withdraw_returns_principal_plus_interest.1.json index 104a4d6..eed4b3e 100644 --- a/lending_pool/test_snapshots/test/test_withdraw_returns_principal_plus_interest.1.json +++ b/lending_pool/test_snapshots/test/test_withdraw_returns_principal_plus_interest.1.json @@ -146,6 +146,31 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "record_yield", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -314,6 +339,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -422,8 +480,26 @@ }, "val": { "i128": { - "hi": -1, - "lo": 18446744073709551416 + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } } }, @@ -454,7 +530,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -485,7 +561,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary" @@ -500,7 +576,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -518,7 +594,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary" @@ -533,7 +609,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary", diff --git a/lending_pool/test_snapshots/test/test_withdraw_succeeds_after_cooldown.1.json b/lending_pool/test_snapshots/test/test_withdraw_succeeds_after_cooldown.1.json index a220da3..4ec22b9 100644 --- a/lending_pool/test_snapshots/test/test_withdraw_succeeds_after_cooldown.1.json +++ b/lending_pool/test_snapshots/test/test_withdraw_succeeds_after_cooldown.1.json @@ -370,6 +370,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "vec": [ @@ -397,7 +415,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/lending_pool/test_snapshots/test/test_withdrawal_with_utilization.1.json b/lending_pool/test_snapshots/test/test_withdrawal_with_utilization.1.json index 928fbfc..7d5df81 100644 --- a/lending_pool/test_snapshots/test/test_withdrawal_with_utilization.1.json +++ b/lending_pool/test_snapshots/test/test_withdrawal_with_utilization.1.json @@ -151,6 +151,8 @@ ], [], [], + [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -169,7 +171,7 @@ { "i128": { "hi": 0, - "lo": 500 + "lo": 100 } } ] @@ -179,6 +181,8 @@ } ] ], + [], + [], [] ], "ledger": { @@ -413,7 +417,7 @@ "val": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } } @@ -503,6 +507,24 @@ } } }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + }, { "key": { "vec": [ @@ -517,7 +539,7 @@ "val": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } }, @@ -530,7 +552,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { @@ -594,7 +616,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary" @@ -609,7 +631,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -627,7 +649,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary" @@ -642,7 +664,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 8370022561469687789 } }, "durability": "temporary", diff --git a/loan_manager/test_snapshots/test/test_access_controls_unauthorized_repay.1.json b/loan_manager/test_snapshots/test/test_access_controls_unauthorized_repay.1.json index 3a9cd94..9e232a7 100644 --- a/loan_manager/test_snapshots/test/test_access_controls_unauthorized_repay.1.json +++ b/loan_manager/test_snapshots/test/test_access_controls_unauthorized_repay.1.json @@ -275,7 +275,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_admin_transfer_via_propose_accept.1.json b/loan_manager/test_snapshots/test/test_admin_transfer_via_propose_accept.1.json index 8d72d28..7032958 100644 --- a/loan_manager/test_snapshots/test/test_admin_transfer_via_propose_accept.1.json +++ b/loan_manager/test_snapshots/test/test_admin_transfer_via_propose_accept.1.json @@ -512,7 +512,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_already_approved_loan.1.json b/loan_manager/test_snapshots/test/test_approve_already_approved_loan.1.json index ecd0926..5fd4d99 100644 --- a/loan_manager/test_snapshots/test/test_approve_already_approved_loan.1.json +++ b/loan_manager/test_snapshots/test/test_approve_already_approved_loan.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_loan_accounts_for_outstanding_approved_loans.1.json b/loan_manager/test_snapshots/test/test_approve_loan_accounts_for_outstanding_approved_loans.1.json index 53392a0..9700e34 100644 --- a/loan_manager/test_snapshots/test/test_approve_loan_accounts_for_outstanding_approved_loans.1.json +++ b/loan_manager/test_snapshots/test/test_approve_loan_accounts_for_outstanding_approved_loans.1.json @@ -901,7 +901,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_loan_fails_when_pool_has_insufficient_liquidity.1.json b/loan_manager/test_snapshots/test/test_approve_loan_fails_when_pool_has_insufficient_liquidity.1.json index 0ac3966..2bfe75e 100644 --- a/loan_manager/test_snapshots/test/test_approve_loan_fails_when_pool_has_insufficient_liquidity.1.json +++ b/loan_manager/test_snapshots/test/test_approve_loan_fails_when_pool_has_insufficient_liquidity.1.json @@ -604,7 +604,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_loan_flow.1.json b/loan_manager/test_snapshots/test/test_approve_loan_flow.1.json index c2e9c94..3847ecd 100644 --- a/loan_manager/test_snapshots/test/test_approve_loan_flow.1.json +++ b/loan_manager/test_snapshots/test/test_approve_loan_flow.1.json @@ -741,7 +741,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_loan_insufficient_pool_liquidity.1.json b/loan_manager/test_snapshots/test/test_approve_loan_insufficient_pool_liquidity.1.json index a8180c5..b606064 100644 --- a/loan_manager/test_snapshots/test/test_approve_loan_insufficient_pool_liquidity.1.json +++ b/loan_manager/test_snapshots/test/test_approve_loan_insufficient_pool_liquidity.1.json @@ -661,7 +661,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_approve_nonexistent_loan.1.json b/loan_manager/test_snapshots/test/test_approve_nonexistent_loan.1.json index 72cf180..781bab6 100644 --- a/loan_manager/test_snapshots/test/test_approve_nonexistent_loan.1.json +++ b/loan_manager/test_snapshots/test/test_approve_nonexistent_loan.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_borrower_can_rerequest_after_cancel_and_reject_at_cap.1.json b/loan_manager/test_snapshots/test/test_borrower_can_rerequest_after_cancel_and_reject_at_cap.1.json index 8c7a378..bd17a23 100644 --- a/loan_manager/test_snapshots/test/test_borrower_can_rerequest_after_cancel_and_reject_at_cap.1.json +++ b/loan_manager/test_snapshots/test/test_borrower_can_rerequest_after_cancel_and_reject_at_cap.1.json @@ -881,7 +881,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_borrower_max_active_loans_blocks_new_requests.1.json b/loan_manager/test_snapshots/test/test_borrower_max_active_loans_blocks_new_requests.1.json index 7380976..a9128c7 100644 --- a/loan_manager/test_snapshots/test/test_borrower_max_active_loans_blocks_new_requests.1.json +++ b/loan_manager/test_snapshots/test/test_borrower_max_active_loans_blocks_new_requests.1.json @@ -898,7 +898,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_borrower_max_active_loans_enforced_and_released_on_repay.1.json b/loan_manager/test_snapshots/test/test_borrower_max_active_loans_enforced_and_released_on_repay.1.json index 9d029a6..80d3cf9 100644 --- a/loan_manager/test_snapshots/test/test_borrower_max_active_loans_enforced_and_released_on_repay.1.json +++ b/loan_manager/test_snapshots/test/test_borrower_max_active_loans_enforced_and_released_on_repay.1.json @@ -1119,7 +1119,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_cancel_loan_decrements_borrower_count.1.json b/loan_manager/test_snapshots/test/test_cancel_loan_decrements_borrower_count.1.json index 597ea03..7c31c51 100644 --- a/loan_manager/test_snapshots/test/test_cancel_loan_decrements_borrower_count.1.json +++ b/loan_manager/test_snapshots/test/test_cancel_loan_decrements_borrower_count.1.json @@ -684,7 +684,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_cancel_pending_loan.1.json b/loan_manager/test_snapshots/test/test_cancel_pending_loan.1.json index b460ab0..bd749d5 100644 --- a/loan_manager/test_snapshots/test/test_cancel_pending_loan.1.json +++ b/loan_manager/test_snapshots/test/test_cancel_pending_loan.1.json @@ -625,7 +625,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_cancel_pending_loan_returns_collateral.1.json b/loan_manager/test_snapshots/test/test_cancel_pending_loan_returns_collateral.1.json index 937b88c..f49a913 100644 --- a/loan_manager/test_snapshots/test/test_cancel_pending_loan_returns_collateral.1.json +++ b/loan_manager/test_snapshots/test/test_cancel_pending_loan_returns_collateral.1.json @@ -687,7 +687,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_check_default_already_repaid.1.json b/loan_manager/test_snapshots/test/test_check_default_already_repaid.1.json index 6bb2494..49725a9 100644 --- a/loan_manager/test_snapshots/test/test_check_default_already_repaid.1.json +++ b/loan_manager/test_snapshots/test/test_check_default_already_repaid.1.json @@ -931,7 +931,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_check_default_not_past_due.1.json b/loan_manager/test_snapshots/test/test_check_default_not_past_due.1.json index ecd0926..5fd4d99 100644 --- a/loan_manager/test_snapshots/test/test_check_default_not_past_due.1.json +++ b/loan_manager/test_snapshots/test/test_check_default_not_past_due.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_check_default_respects_default_window.1.json b/loan_manager/test_snapshots/test/test_check_default_respects_default_window.1.json index b16e8f9..f6d391c 100644 --- a/loan_manager/test_snapshots/test/test_check_default_respects_default_window.1.json +++ b/loan_manager/test_snapshots/test/test_check_default_respects_default_window.1.json @@ -792,7 +792,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_check_default_success.1.json b/loan_manager/test_snapshots/test/test_check_default_success.1.json index b958592..4dea732 100644 --- a/loan_manager/test_snapshots/test/test_check_default_success.1.json +++ b/loan_manager/test_snapshots/test/test_check_default_success.1.json @@ -969,7 +969,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_check_defaults_batch.1.json b/loan_manager/test_snapshots/test/test_check_defaults_batch.1.json index f9e7c48..cefc2b1 100644 --- a/loan_manager/test_snapshots/test/test_check_defaults_batch.1.json +++ b/loan_manager/test_snapshots/test/test_check_defaults_batch.1.json @@ -1803,7 +1803,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_collateral_is_seized_on_batch_default.1.json b/loan_manager/test_snapshots/test/test_collateral_is_seized_on_batch_default.1.json index 878480a..245d8d1 100644 --- a/loan_manager/test_snapshots/test/test_collateral_is_seized_on_batch_default.1.json +++ b/loan_manager/test_snapshots/test/test_collateral_is_seized_on_batch_default.1.json @@ -1599,7 +1599,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_collateral_is_seized_on_default.1.json b/loan_manager/test_snapshots/test/test_collateral_is_seized_on_default.1.json index c2ae97b..05e2087 100644 --- a/loan_manager/test_snapshots/test/test_collateral_is_seized_on_default.1.json +++ b/loan_manager/test_snapshots/test/test_collateral_is_seized_on_default.1.json @@ -1077,7 +1077,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_collateral_release_works_while_paused.1.json b/loan_manager/test_snapshots/test/test_collateral_release_works_while_paused.1.json index 5a79a3c..fa68438 100644 --- a/loan_manager/test_snapshots/test/test_collateral_release_works_while_paused.1.json +++ b/loan_manager/test_snapshots/test/test_collateral_release_works_while_paused.1.json @@ -982,7 +982,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_configurable_interest_rate_and_default_term.1.json b/loan_manager/test_snapshots/test/test_configurable_interest_rate_and_default_term.1.json index 92f11ad..ff78119 100644 --- a/loan_manager/test_snapshots/test/test_configurable_interest_rate_and_default_term.1.json +++ b/loan_manager/test_snapshots/test/test_configurable_interest_rate_and_default_term.1.json @@ -844,7 +844,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_deposit_collateral_and_auto_release_on_full_repayment.1.json b/loan_manager/test_snapshots/test/test_deposit_collateral_and_auto_release_on_full_repayment.1.json index 2ca7cdb..9f2c405 100644 --- a/loan_manager/test_snapshots/test/test_deposit_collateral_and_auto_release_on_full_repayment.1.json +++ b/loan_manager/test_snapshots/test/test_deposit_collateral_and_auto_release_on_full_repayment.1.json @@ -986,7 +986,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_deposit_collateral_rejects_non_active_loan.1.json b/loan_manager/test_snapshots/test/test_deposit_collateral_rejects_non_active_loan.1.json index ed36e5c..c461216 100644 --- a/loan_manager/test_snapshots/test/test_deposit_collateral_rejects_non_active_loan.1.json +++ b/loan_manager/test_snapshots/test/test_deposit_collateral_rejects_non_active_loan.1.json @@ -603,7 +603,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_charges_fee.1.json b/loan_manager/test_snapshots/test/test_extend_loan_charges_fee.1.json index 5d1a8c4..1cf637c 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_charges_fee.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_charges_fee.1.json @@ -847,7 +847,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_happy_path.1.json b/loan_manager/test_snapshots/test/test_extend_loan_happy_path.1.json index 8524452..d06a3ff 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_happy_path.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_happy_path.1.json @@ -789,7 +789,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_max_extensions_limit.1.json b/loan_manager/test_snapshots/test/test_extend_loan_max_extensions_limit.1.json index 1547222..aaf4f3b 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_max_extensions_limit.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_max_extensions_limit.1.json @@ -945,7 +945,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_multiple_extensions.1.json b/loan_manager/test_snapshots/test/test_extend_loan_multiple_extensions.1.json index 4850666..fa142c4 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_multiple_extensions.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_multiple_extensions.1.json @@ -947,7 +947,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_not_found.1.json b/loan_manager/test_snapshots/test/test_extend_loan_not_found.1.json index 7660265..35c907d 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_not_found.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_not_found.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_defaulted_loan.1.json b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_defaulted_loan.1.json index 045492e..2701d48 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_defaulted_loan.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_defaulted_loan.1.json @@ -969,7 +969,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_pending_loan.1.json b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_pending_loan.1.json index d1a9ff1..6b44193 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_pending_loan.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_pending_loan.1.json @@ -603,7 +603,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_repaid_loan.1.json b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_repaid_loan.1.json index 0dc7ef7..46ca253 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_repaid_loan.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_repaid_loan.1.json @@ -931,7 +931,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_zero_ledgers.1.json b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_zero_ledgers.1.json index ecd0926..5fd4d99 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_zero_ledgers.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_rejected_for_zero_ledgers.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_extend_loan_wrong_borrower.1.json b/loan_manager/test_snapshots/test/test_extend_loan_wrong_borrower.1.json index bc25a2f..bd1d8f9 100644 --- a/loan_manager/test_snapshots/test/test_extend_loan_wrong_borrower.1.json +++ b/loan_manager/test_snapshots/test/test_extend_loan_wrong_borrower.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_full_repayment_ignores_minimum_amount.1.json b/loan_manager/test_snapshots/test/test_full_repayment_ignores_minimum_amount.1.json index 838a822..c3ffcb0 100644 --- a/loan_manager/test_snapshots/test/test_full_repayment_ignores_minimum_amount.1.json +++ b/loan_manager/test_snapshots/test/test_full_repayment_ignores_minimum_amount.1.json @@ -987,7 +987,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_get_borrower_loans.1.json b/loan_manager/test_snapshots/test/test_get_borrower_loans.1.json index 0e4de31..93a49f9 100644 --- a/loan_manager/test_snapshots/test/test_get_borrower_loans.1.json +++ b/loan_manager/test_snapshots/test/test_get_borrower_loans.1.json @@ -1042,7 +1042,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_interest_calculation_overflow_safety.1.json b/loan_manager/test_snapshots/test/test_interest_calculation_overflow_safety.1.json index f1f1a11..9d774af 100644 --- a/loan_manager/test_snapshots/test/test_interest_calculation_overflow_safety.1.json +++ b/loan_manager/test_snapshots/test/test_interest_calculation_overflow_safety.1.json @@ -1084,7 +1084,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_late_fee_cap_at_total_debt_limit.1.json b/loan_manager/test_snapshots/test/test_late_fee_cap_at_total_debt_limit.1.json index fa61af5..d0fc362 100644 --- a/loan_manager/test_snapshots/test/test_late_fee_cap_at_total_debt_limit.1.json +++ b/loan_manager/test_snapshots/test/test_late_fee_cap_at_total_debt_limit.1.json @@ -797,7 +797,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_late_fees_stop_accruing_when_principal_paid.1.json b/loan_manager/test_snapshots/test/test_late_fees_stop_accruing_when_principal_paid.1.json index 7b0d650..626f07c 100644 --- a/loan_manager/test_snapshots/test/test_late_fees_stop_accruing_when_principal_paid.1.json +++ b/loan_manager/test_snapshots/test/test_late_fees_stop_accruing_when_principal_paid.1.json @@ -931,7 +931,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_late_full_repayment_applies_score_penalty.1.json b/loan_manager/test_snapshots/test/test_late_full_repayment_applies_score_penalty.1.json index 07a0408..f56af88 100644 --- a/loan_manager/test_snapshots/test/test_late_full_repayment_applies_score_penalty.1.json +++ b/loan_manager/test_snapshots/test/test_late_full_repayment_applies_score_penalty.1.json @@ -935,7 +935,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_legacy_zero_interest_config_falls_back_to_default.1.json b/loan_manager/test_snapshots/test/test_legacy_zero_interest_config_falls_back_to_default.1.json index f1bf7fe..03af2b5 100644 --- a/loan_manager/test_snapshots/test/test_legacy_zero_interest_config_falls_back_to_default.1.json +++ b/loan_manager/test_snapshots/test/test_legacy_zero_interest_config_falls_back_to_default.1.json @@ -663,7 +663,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_liquidate_rejects_healthy_collateral_ratio.1.json b/loan_manager/test_snapshots/test/test_liquidate_rejects_healthy_collateral_ratio.1.json index 31ba1c8..7d2c9a6 100644 --- a/loan_manager/test_snapshots/test/test_liquidate_rejects_healthy_collateral_ratio.1.json +++ b/loan_manager/test_snapshots/test/test_liquidate_rejects_healthy_collateral_ratio.1.json @@ -848,7 +848,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_liquidate_under_threshold_transfers_bonus_and_refund.1.json b/loan_manager/test_snapshots/test/test_liquidate_under_threshold_transfers_bonus_and_refund.1.json index 92ac6bd..0f6dae2 100644 --- a/loan_manager/test_snapshots/test/test_liquidate_under_threshold_transfers_bonus_and_refund.1.json +++ b/loan_manager/test_snapshots/test/test_liquidate_under_threshold_transfers_bonus_and_refund.1.json @@ -980,7 +980,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_liquidation_bonus_cap_enforced.1.json b/loan_manager/test_snapshots/test/test_liquidation_bonus_cap_enforced.1.json index 50564f1..834b41f 100644 --- a/loan_manager/test_snapshots/test/test_liquidation_bonus_cap_enforced.1.json +++ b/loan_manager/test_snapshots/test/test_liquidation_bonus_cap_enforced.1.json @@ -975,7 +975,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_loan_request_failure_low_score.1.json b/loan_manager/test_snapshots/test/test_loan_request_failure_low_score.1.json index ca58bc6..7854a16 100644 --- a/loan_manager/test_snapshots/test/test_loan_request_failure_low_score.1.json +++ b/loan_manager/test_snapshots/test/test_loan_request_failure_low_score.1.json @@ -575,7 +575,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_loan_request_success.1.json b/loan_manager/test_snapshots/test/test_loan_request_success.1.json index ea90ae5..f4c0bfc 100644 --- a/loan_manager/test_snapshots/test/test_loan_request_success.1.json +++ b/loan_manager/test_snapshots/test/test_loan_request_success.1.json @@ -604,7 +604,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_migration_guard_prevents_double_execution.1.json b/loan_manager/test_snapshots/test/test_migration_guard_prevents_double_execution.1.json index c86dc06..a4c738a 100644 --- a/loan_manager/test_snapshots/test/test_migration_guard_prevents_double_execution.1.json +++ b/loan_manager/test_snapshots/test/test_migration_guard_prevents_double_execution.1.json @@ -896,7 +896,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_minimum_repayment_amount_enforced.1.json b/loan_manager/test_snapshots/test/test_minimum_repayment_amount_enforced.1.json index 82a1136..9d2c531 100644 --- a/loan_manager/test_snapshots/test/test_minimum_repayment_amount_enforced.1.json +++ b/loan_manager/test_snapshots/test/test_minimum_repayment_amount_enforced.1.json @@ -853,7 +853,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_non_admin_cannot_pause.1.json b/loan_manager/test_snapshots/test/test_non_admin_cannot_pause.1.json index 4ab0980..ddf12aa 100644 --- a/loan_manager/test_snapshots/test/test_non_admin_cannot_pause.1.json +++ b/loan_manager/test_snapshots/test/test_non_admin_cannot_pause.1.json @@ -444,7 +444,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_oracle_rate_above_max_falls_back_to_default.1.json b/loan_manager/test_snapshots/test/test_oracle_rate_above_max_falls_back_to_default.1.json index ac6e8c2..296ed6d 100644 --- a/loan_manager/test_snapshots/test/test_oracle_rate_above_max_falls_back_to_default.1.json +++ b/loan_manager/test_snapshots/test/test_oracle_rate_above_max_falls_back_to_default.1.json @@ -713,7 +713,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_oracle_rate_below_min_falls_back_to_default.1.json b/loan_manager/test_snapshots/test/test_oracle_rate_below_min_falls_back_to_default.1.json index 6faf149..5b1137b 100644 --- a/loan_manager/test_snapshots/test/test_oracle_rate_below_min_falls_back_to_default.1.json +++ b/loan_manager/test_snapshots/test/test_oracle_rate_below_min_falls_back_to_default.1.json @@ -713,7 +713,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_oracle_rate_within_bounds_accepted.1.json b/loan_manager/test_snapshots/test/test_oracle_rate_within_bounds_accepted.1.json index a8d51ff..f1a991c 100644 --- a/loan_manager/test_snapshots/test/test_oracle_rate_within_bounds_accepted.1.json +++ b/loan_manager/test_snapshots/test/test_oracle_rate_within_bounds_accepted.1.json @@ -661,7 +661,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_overdue_partial_repayment_still_reduces_principal.1.json b/loan_manager/test_snapshots/test/test_overdue_partial_repayment_still_reduces_principal.1.json index 6a3c21d..669704c 100644 --- a/loan_manager/test_snapshots/test/test_overdue_partial_repayment_still_reduces_principal.1.json +++ b/loan_manager/test_snapshots/test/test_overdue_partial_repayment_still_reduces_principal.1.json @@ -1036,7 +1036,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_overdue_repayment_charges_late_fee.1.json b/loan_manager/test_snapshots/test/test_overdue_repayment_charges_late_fee.1.json index ec6e241..91e8ece 100644 --- a/loan_manager/test_snapshots/test/test_overdue_repayment_charges_late_fee.1.json +++ b/loan_manager/test_snapshots/test/test_overdue_repayment_charges_late_fee.1.json @@ -1037,7 +1037,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_partial_repayment_tracks_split_balances.1.json b/loan_manager/test_snapshots/test/test_partial_repayment_tracks_split_balances.1.json index a7ccad9..3cd177a 100644 --- a/loan_manager/test_snapshots/test/test_partial_repayment_tracks_split_balances.1.json +++ b/loan_manager/test_snapshots/test/test_partial_repayment_tracks_split_balances.1.json @@ -986,7 +986,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_pause_blocks_approve_loan.1.json b/loan_manager/test_snapshots/test/test_pause_blocks_approve_loan.1.json index 102fbb9..d50370f 100644 --- a/loan_manager/test_snapshots/test/test_pause_blocks_approve_loan.1.json +++ b/loan_manager/test_snapshots/test/test_pause_blocks_approve_loan.1.json @@ -710,7 +710,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_pause_blocks_repay.1.json b/loan_manager/test_snapshots/test/test_pause_blocks_repay.1.json index 7071ea9..aab0504 100644 --- a/loan_manager/test_snapshots/test/test_pause_blocks_repay.1.json +++ b/loan_manager/test_snapshots/test/test_pause_blocks_repay.1.json @@ -846,7 +846,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_pause_blocks_request_loan.1.json b/loan_manager/test_snapshots/test/test_pause_blocks_request_loan.1.json index 8bdac2b..e46bef9 100644 --- a/loan_manager/test_snapshots/test/test_pause_blocks_request_loan.1.json +++ b/loan_manager/test_snapshots/test/test_pause_blocks_request_loan.1.json @@ -624,7 +624,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_paused_blocks_new_loans_and_repayments_but_allows_collateral_release.1.json b/loan_manager/test_snapshots/test/test_paused_blocks_new_loans_and_repayments_but_allows_collateral_release.1.json index ee334ab..199d3d7 100644 --- a/loan_manager/test_snapshots/test/test_paused_blocks_new_loans_and_repayments_but_allows_collateral_release.1.json +++ b/loan_manager/test_snapshots/test/test_paused_blocks_new_loans_and_repayments_but_allows_collateral_release.1.json @@ -1111,7 +1111,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_pending_loans_count_against_cap.1.json b/loan_manager/test_snapshots/test/test_pending_loans_count_against_cap.1.json index 56015c1..745270d 100644 --- a/loan_manager/test_snapshots/test/test_pending_loans_count_against_cap.1.json +++ b/loan_manager/test_snapshots/test/test_pending_loans_count_against_cap.1.json @@ -742,7 +742,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_query_functions.1.json b/loan_manager/test_snapshots/test/test_query_functions.1.json index d881bbc..40015ce 100644 --- a/loan_manager/test_snapshots/test/test_query_functions.1.json +++ b/loan_manager/test_snapshots/test/test_query_functions.1.json @@ -665,7 +665,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_rate_bounds_boundary_values.1.json b/loan_manager/test_snapshots/test/test_rate_bounds_boundary_values.1.json index 91f09e2..e810783 100644 --- a/loan_manager/test_snapshots/test/test_rate_bounds_boundary_values.1.json +++ b/loan_manager/test_snapshots/test/test_rate_bounds_boundary_values.1.json @@ -654,7 +654,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_rate_bounds_configurable_independently.1.json b/loan_manager/test_snapshots/test/test_rate_bounds_configurable_independently.1.json index b658ebd..a8106d4 100644 --- a/loan_manager/test_snapshots/test/test_rate_bounds_configurable_independently.1.json +++ b/loan_manager/test_snapshots/test/test_rate_bounds_configurable_independently.1.json @@ -550,7 +550,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_rate_bounds_persist_across_operations.1.json b/loan_manager/test_snapshots/test/test_rate_bounds_persist_across_operations.1.json index 539ffc4..73c89c3 100644 --- a/loan_manager/test_snapshots/test/test_rate_bounds_persist_across_operations.1.json +++ b/loan_manager/test_snapshots/test/test_rate_bounds_persist_across_operations.1.json @@ -895,7 +895,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_refinance_loan_decreases_principal_returns_excess_to_pool.1.json b/loan_manager/test_snapshots/test/test_refinance_loan_decreases_principal_returns_excess_to_pool.1.json index 8194b68..162894c 100644 --- a/loan_manager/test_snapshots/test/test_refinance_loan_decreases_principal_returns_excess_to_pool.1.json +++ b/loan_manager/test_snapshots/test/test_refinance_loan_decreases_principal_returns_excess_to_pool.1.json @@ -969,7 +969,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_refinance_loan_fails_when_score_drops_below_minimum.1.json b/loan_manager/test_snapshots/test/test_refinance_loan_fails_when_score_drops_below_minimum.1.json index 31b9078..b60ea04 100644 --- a/loan_manager/test_snapshots/test/test_refinance_loan_fails_when_score_drops_below_minimum.1.json +++ b/loan_manager/test_snapshots/test/test_refinance_loan_fails_when_score_drops_below_minimum.1.json @@ -741,7 +741,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_refinance_loan_increases_principal_draws_from_pool.1.json b/loan_manager/test_snapshots/test/test_refinance_loan_increases_principal_draws_from_pool.1.json index 2f7e87f..48c144e 100644 --- a/loan_manager/test_snapshots/test/test_refinance_loan_increases_principal_draws_from_pool.1.json +++ b/loan_manager/test_snapshots/test/test_refinance_loan_increases_principal_draws_from_pool.1.json @@ -915,7 +915,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_reject_loan_decrements_borrower_count.1.json b/loan_manager/test_snapshots/test/test_reject_loan_decrements_borrower_count.1.json index 692f506..eac1d74 100644 --- a/loan_manager/test_snapshots/test/test_reject_loan_decrements_borrower_count.1.json +++ b/loan_manager/test_snapshots/test/test_reject_loan_decrements_borrower_count.1.json @@ -717,7 +717,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_reject_pending_loan.1.json b/loan_manager/test_snapshots/test/test_reject_pending_loan.1.json index 2514ff2..98573bf 100644 --- a/loan_manager/test_snapshots/test/test_reject_pending_loan.1.json +++ b/loan_manager/test_snapshots/test/test_reject_pending_loan.1.json @@ -658,7 +658,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_reject_pending_loan_returns_collateral.1.json b/loan_manager/test_snapshots/test/test_reject_pending_loan_returns_collateral.1.json index 891a3f4..2e844e5 100644 --- a/loan_manager/test_snapshots/test/test_reject_pending_loan_returns_collateral.1.json +++ b/loan_manager/test_snapshots/test/test_reject_pending_loan_returns_collateral.1.json @@ -720,7 +720,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_repayment_flow.1.json b/loan_manager/test_snapshots/test/test_repayment_flow.1.json index 783679f..1d9988e 100644 --- a/loan_manager/test_snapshots/test/test_repayment_flow.1.json +++ b/loan_manager/test_snapshots/test/test_repayment_flow.1.json @@ -1023,7 +1023,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_request_loan_above_max_amount_fails.1.json b/loan_manager/test_snapshots/test/test_request_loan_above_max_amount_fails.1.json index f1ecebf..0f84a9c 100644 --- a/loan_manager/test_snapshots/test/test_request_loan_above_max_amount_fails.1.json +++ b/loan_manager/test_snapshots/test/test_request_loan_above_max_amount_fails.1.json @@ -630,7 +630,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_request_loan_negative_amount.1.json b/loan_manager/test_snapshots/test/test_request_loan_negative_amount.1.json index 9ce9f47..f64cd61 100644 --- a/loan_manager/test_snapshots/test/test_request_loan_negative_amount.1.json +++ b/loan_manager/test_snapshots/test/test_request_loan_negative_amount.1.json @@ -575,7 +575,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json b/loan_manager/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json index 1ebde2a..b903f0c 100644 --- a/loan_manager/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json +++ b/loan_manager/test_snapshots/test/test_set_admin_updates_admin_immediately.1.json @@ -510,7 +510,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_interest_rate_zero_rejected.1.json b/loan_manager/test_snapshots/test/test_set_interest_rate_zero_rejected.1.json index 72cf180..781bab6 100644 --- a/loan_manager/test_snapshots/test/test_set_interest_rate_zero_rejected.1.json +++ b/loan_manager/test_snapshots/test/test_set_interest_rate_zero_rejected.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_late_fee_rate_rejects_above_cap.1.json b/loan_manager/test_snapshots/test/test_set_late_fee_rate_rejects_above_cap.1.json index 72cf180..781bab6 100644 --- a/loan_manager/test_snapshots/test/test_set_late_fee_rate_rejects_above_cap.1.json +++ b/loan_manager/test_snapshots/test/test_set_late_fee_rate_rejects_above_cap.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_max_rate_below_min_rejected.1.json b/loan_manager/test_snapshots/test/test_set_max_rate_below_min_rejected.1.json index 9efa7ba..8386eee 100644 --- a/loan_manager/test_snapshots/test/test_set_max_rate_below_min_rejected.1.json +++ b/loan_manager/test_snapshots/test/test_set_max_rate_below_min_rejected.1.json @@ -495,7 +495,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_max_rate_bps_success.1.json b/loan_manager/test_snapshots/test/test_set_max_rate_bps_success.1.json index aa8dc21..5a2798e 100644 --- a/loan_manager/test_snapshots/test/test_set_max_rate_bps_success.1.json +++ b/loan_manager/test_snapshots/test/test_set_max_rate_bps_success.1.json @@ -496,7 +496,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_max_rate_bps_zero_rejected.1.json b/loan_manager/test_snapshots/test/test_set_max_rate_bps_zero_rejected.1.json index 72cf180..781bab6 100644 --- a/loan_manager/test_snapshots/test/test_set_max_rate_bps_zero_rejected.1.json +++ b/loan_manager/test_snapshots/test/test_set_max_rate_bps_zero_rejected.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_min_rate_bps_success.1.json b/loan_manager/test_snapshots/test/test_set_min_rate_bps_success.1.json index a0c9779..bd96db3 100644 --- a/loan_manager/test_snapshots/test/test_set_min_rate_bps_success.1.json +++ b/loan_manager/test_snapshots/test/test_set_min_rate_bps_success.1.json @@ -496,7 +496,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_min_rate_bps_zero_rejected.1.json b/loan_manager/test_snapshots/test/test_set_min_rate_bps_zero_rejected.1.json index 72cf180..781bab6 100644 --- a/loan_manager/test_snapshots/test/test_set_min_rate_bps_zero_rejected.1.json +++ b/loan_manager/test_snapshots/test/test_set_min_rate_bps_zero_rejected.1.json @@ -443,7 +443,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_set_min_rate_exceeds_max_rejected.1.json b/loan_manager/test_snapshots/test/test_set_min_rate_exceeds_max_rejected.1.json index c898e6f..edb1d38 100644 --- a/loan_manager/test_snapshots/test/test_set_min_rate_exceeds_max_rejected.1.json +++ b/loan_manager/test_snapshots/test/test_set_min_rate_exceeds_max_rejected.1.json @@ -495,7 +495,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_small_loan_interest_accrual_precision.1.json b/loan_manager/test_snapshots/test/test_small_loan_interest_accrual_precision.1.json index 5934318..f121968 100644 --- a/loan_manager/test_snapshots/test/test_small_loan_interest_accrual_precision.1.json +++ b/loan_manager/test_snapshots/test/test_small_loan_interest_accrual_precision.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_small_repayment_does_not_change_score.1.json b/loan_manager/test_snapshots/test/test_small_repayment_does_not_change_score.1.json index 94e3521..012049c 100644 --- a/loan_manager/test_snapshots/test/test_small_repayment_does_not_change_score.1.json +++ b/loan_manager/test_snapshots/test/test_small_repayment_does_not_change_score.1.json @@ -905,7 +905,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_unpause_restores_request_loan.1.json b/loan_manager/test_snapshots/test/test_unpause_restores_request_loan.1.json index 980c970..481a000 100644 --- a/loan_manager/test_snapshots/test/test_unpause_restores_request_loan.1.json +++ b/loan_manager/test_snapshots/test/test_unpause_restores_request_loan.1.json @@ -702,7 +702,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_upgrade_requires_admin_auth.1.json b/loan_manager/test_snapshots/test/test_upgrade_requires_admin_auth.1.json index 3a9cd94..9e232a7 100644 --- a/loan_manager/test_snapshots/test/test_upgrade_requires_admin_auth.1.json +++ b/loan_manager/test_snapshots/test/test_upgrade_requires_admin_auth.1.json @@ -275,7 +275,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { From f1dabd52d2f158e39b29a246c27096ac08189d3a Mon Sep 17 00:00:00 2001 From: xeladev4 Date: Sat, 20 Jun 2026 01:14:51 +0100 Subject: [PATCH 2/2] address review: wire record_yield into repayment path; CEI + invariant guard Once share value tracks TotalManagedAssets instead of the raw balance, loan interest transferred into the pool no longer reaches LPs automatically. Wire it up: - lending_pool: add a per-token authorized yield reporter (set_loan_manager/get_loan_manager, admin-gated, emits LoanManagerUpdated) and gate record_yield to that reporter, falling back to admin when unset. - loan_manager: report the interest + late-fee portion of a repayment and the extension fee as yield via record_yield. Best-effort and non-fatal (only when configured as the pool's reporter; pool-side errors are swallowed) so it can never block a repayment. liquidate is intentionally left unwired and documented, since recovered interest needs a paired principal write-off (record_loss) to avoid inflating share value during a loss event. Review nits: - calc_shares_to_mint documents the managed-assets-positive invariant with a debug_assert instead of silently minting 1:1 when total_assets_before == 0. - redeem_shares now commits all accounting before the token transfer (CEI). Adds pool tests for reporter gating and end-to-end loan_manager tests proving repaid interest reaches LP share value and that repayment still succeeds when no reporter is configured. --- lending_pool/src/events.rs | 5 + lending_pool/src/lib.rs | 73 +- lending_pool/src/test.rs | 84 + ...yield_gated_to_configured_reporter.1.json} | 306 +-- ...est_set_loan_manager_requires_admin.1.json | 351 +++ loan_manager/src/lib.rs | 44 + loan_manager/src/test.rs | 118 + ...borrower_requested_term_not_default.1.json | 2 +- ...test_quote_total_debt_matches_repay.1.json | 1855 +++++++++++++ ...yment_interest_credited_to_pool_lps.1.json | 2312 +++++++++++++++++ ...s_when_pool_reporter_not_configured.1.json | 2238 ++++++++++++++++ 11 files changed, 7153 insertions(+), 235 deletions(-) rename lending_pool/test_snapshots/test/{test_inflation_attack_via_donation_is_prevented.1.json => test_record_yield_gated_to_configured_reporter.1.json} (83%) create mode 100644 lending_pool/test_snapshots/test/test_set_loan_manager_requires_admin.1.json create mode 100644 loan_manager/test_snapshots/test/test_quote_total_debt_matches_repay.1.json create mode 100644 loan_manager/test_snapshots/test/test_repayment_interest_credited_to_pool_lps.1.json create mode 100644 loan_manager/test_snapshots/test/test_repayment_succeeds_when_pool_reporter_not_configured.1.json diff --git a/lending_pool/src/events.rs b/lending_pool/src/events.rs index 1749be6..eeaa6c9 100644 --- a/lending_pool/src/events.rs +++ b/lending_pool/src/events.rs @@ -29,6 +29,11 @@ pub fn yield_distributed(env: &Env, token: Address, amount: i128) { env.events().publish(topics, amount); } +pub fn loan_manager_updated(env: &Env, token: Address, loan_manager: Address) { + let topics = (Symbol::new(env, "LoanManagerUpdated"), token); + env.events().publish(topics, loan_manager); +} + pub fn deposit_cap_updated( env: &Env, token: Address, diff --git a/lending_pool/src/lib.rs b/lending_pool/src/lib.rs index a653baf..6c2759d 100644 --- a/lending_pool/src/lib.rs +++ b/lending_pool/src/lib.rs @@ -75,6 +75,12 @@ pub enum DataKey { /// exchange rate. Unaffected by direct token transfers or by principal /// temporarily out on loan. See the module-level accounting note. TotalManagedAssets(Address), + /// token → address authorized to report realized yield via `record_yield` + /// (normally the LoanManager that repayments flow through). Lets the + /// repayment path credit interest to LPs automatically while keeping + /// `record_yield` gated, so arbitrary callers still cannot move the share + /// price. + LoanManager(Address), /// token → number of active depositors DepositorCount(Address), ProposedAdmin, @@ -172,6 +178,14 @@ impl LendingPool { Self::bump_instance_ttl(env); } + /// Address authorized to report realized yield for `token`, if configured. + fn loan_manager(env: &Env, token: &Address) -> Option
{ + Self::bump_instance_ttl(env); + env.storage() + .instance() + .get(&DataKey::LoanManager(token.clone())) + } + fn read_shares(env: &Env, provider: &Address, token: &Address) -> i128 { let key = DataKey::Shares(provider.clone(), token.clone()); let shares: i128 = env.storage().persistent().get(&key).unwrap_or(0); @@ -242,9 +256,20 @@ impl LendingPool { total_assets_before: i128, cur_total_shares: i128, ) -> i128 { - if cur_total_shares == 0 || total_assets_before == 0 { + if cur_total_shares == 0 { + // First depositor into an empty share pool: 1:1 allocation. amount } else { + // Invariant: once shares exist, managed assets are strictly positive. + // deposit and redeem move shares and managed assets together, and + // record_yield only ever increases managed assets (and requires + // shares > 0), so `total_assets_before == 0` here is unreachable. The + // checked_div below would surface any violation as a panic rather + // than silently minting a diluting 1:1 allocation. + debug_assert!( + total_assets_before > 0, + "managed assets must be positive while shares are outstanding" + ); amount .checked_mul(cur_total_shares) .and_then(|v| v.checked_div(total_assets_before)) @@ -342,12 +367,6 @@ impl LendingPool { .and_then(|v| v.checked_div(cur_total_shares)) .expect("principal redeem overflow"); - TokenClient::new(env, token).transfer( - &env.current_contract_address(), - provider, - &assets_to_return, - ); - let share_key = DataKey::Shares(provider.clone(), token.clone()); let deposit_key = DataKey::DepositTimestamp(provider.clone(), token.clone()); let remaining = cur_shares.checked_sub(shares).expect("share underflow"); @@ -386,6 +405,15 @@ impl LendingPool { .set(&DataKey::TotalDeposits(token.clone()), &new_total_deposits); Self::bump_instance_ttl(env); + + // Interaction last (checks-effects-interactions): all accounting is + // committed before the token leaves the pool. + TokenClient::new(env, token).transfer( + &env.current_contract_address(), + provider, + &assets_to_return, + ); + Ok(assets_to_return) } @@ -734,22 +762,49 @@ impl LendingPool { Ok(()) } + /// Authorize `loan_manager` to report realized yield for `token` via + /// [`record_yield`](Self::record_yield). Set this to the LoanManager that + /// repayments flow through so interest is credited to LPs automatically. + /// Admin-gated. + pub fn set_loan_manager(env: Env, token: Address, loan_manager: Address) { + Self::admin(&env).require_auth(); + env.storage() + .instance() + .set(&DataKey::LoanManager(token.clone()), &loan_manager); + Self::bump_instance_ttl(&env); + loan_manager_updated(&env, token, loan_manager); + } + + /// The address authorized to report yield for `token`, if any. + pub fn get_loan_manager(env: Env, token: Address) -> Option
{ + Self::loan_manager(&env, &token) + } + /// Record `amount` of realized yield (e.g. loan interest repaid into the /// pool), raising every outstanding share's value pro-rata. /// /// This is the *only* way assets enter share value besides deposits. Because /// a contract cannot distinguish a legitimate interest repayment from an /// unsolicited donation by looking at its balance, yield is recognised - /// through this deliberate, admin-gated call rather than by reading the raw + /// through this deliberate, access-gated call rather than by reading the raw /// balance. That is precisely what stops a direct transfer from arbitrarily /// changing existing holders' redeemable value (issue #2). /// + /// Authorization: the configured [`LoanManager`] reporter for `token` (so the + /// repayment path can credit interest automatically), or the admin when no + /// reporter is configured (manual / keeper operation). + /// /// Yield is not principal, so it does not move `TotalDeposits` or count /// against the `MaxPoolSize` cap. The caller is responsible for ensuring the /// corresponding tokens are actually present in the pool; otherwise later /// redemptions will hit the `InsufficientLiquidity` gate. pub fn record_yield(env: Env, token: Address, amount: i128) -> Result<(), PoolError> { - Self::admin(&env).require_auth(); + // Gate on the configured yield reporter, falling back to admin so the + // function is still usable manually before a LoanManager is wired up. + match Self::loan_manager(&env, &token) { + Some(reporter) => reporter.require_auth(), + None => Self::admin(&env).require_auth(), + } Self::assert_not_paused(&env)?; if amount <= 0 { diff --git a/lending_pool/src/test.rs b/lending_pool/src/test.rs index afb2a78..70b2d70 100644 --- a/lending_pool/src/test.rs +++ b/lending_pool/src/test.rs @@ -1707,3 +1707,87 @@ fn test_record_yield_rejected_when_no_shares_outstanding() { let res = pool_client.try_record_yield(&token_id, &100); assert_eq!(res, Err(Ok(crate::PoolError::InvalidAmount))); } + +#[test] +fn test_record_yield_gated_to_configured_reporter() { + // Once a loan-manager reporter is configured for a token, it (and not the + // admin) is the authority for record_yield — this is what lets the + // repayment path credit interest automatically while still blocking + // arbitrary callers. + let env = Env::default(); + + let admin = Address::generate(&env); + let (token_id, stellar_asset_client, _token_client) = create_token_contract(&env, &admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + + env.mock_all_auths(); + pool_client.initialize(&admin); + pool_client.set_withdrawal_cooldown(&0); + + let provider = Address::generate(&env); + stellar_asset_client.mint(&provider, &1_000); + pool_client.deposit(&provider, &token_id, &1_000); + + let reporter = Address::generate(&env); + pool_client.set_loan_manager(&token_id, &reporter); + assert_eq!( + pool_client.get_loan_manager(&token_id), + Some(reporter.clone()) + ); + + // The configured reporter can record yield. + env.mock_auths(&[soroban_sdk::testutils::MockAuth { + address: &reporter, + invoke: &soroban_sdk::testutils::MockAuthInvoke { + contract: &pool_id, + fn_name: "record_yield", + args: (token_id.clone(), 100i128).into_val(&env), + sub_invokes: &[], + }, + }]); + pool_client.record_yield(&token_id, &100); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 1_100); + + // The admin is no longer the authority once a reporter is configured. + env.mock_auths(&[soroban_sdk::testutils::MockAuth { + address: &admin, + invoke: &soroban_sdk::testutils::MockAuthInvoke { + contract: &pool_id, + fn_name: "record_yield", + args: (token_id.clone(), 50i128).into_val(&env), + sub_invokes: &[], + }, + }]); + assert!(pool_client.try_record_yield(&token_id, &50).is_err()); +} + +#[test] +fn test_set_loan_manager_requires_admin() { + let env = Env::default(); + + let admin = Address::generate(&env); + let (token_id, _stellar_asset_client, _token_client) = create_token_contract(&env, &admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + + env.mock_all_auths(); + pool_client.initialize(&admin); + + let reporter = Address::generate(&env); + let attacker = Address::generate(&env); + env.mock_auths(&[soroban_sdk::testutils::MockAuth { + address: &attacker, + invoke: &soroban_sdk::testutils::MockAuthInvoke { + contract: &pool_id, + fn_name: "set_loan_manager", + args: (token_id.clone(), reporter.clone()).into_val(&env), + sub_invokes: &[], + }, + }]); + assert!(pool_client + .try_set_loan_manager(&token_id, &reporter) + .is_err()); +} diff --git a/lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json b/lending_pool/test_snapshots/test/test_record_yield_gated_to_configured_reporter.1.json similarity index 83% rename from lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json rename to lending_pool/test_snapshots/test/test_record_yield_gated_to_configured_reporter.1.json index 66b6617..89b5d8c 100644 --- a/lending_pool/test_snapshots/test/test_inflation_attack_via_donation_is_prevented.1.json +++ b/lending_pool/test_snapshots/test/test_record_yield_gated_to_configured_reporter.1.json @@ -1,7 +1,7 @@ { "generators": { "address": 5, - "nonce": 0 + "nonce": 2 }, "auth": [ [ @@ -56,31 +56,6 @@ { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, - { - "i128": { - "hi": 0, - "lo": 10001 - } - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "function_name": "mint", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, { "i128": { "hi": 0, @@ -112,7 +87,7 @@ { "i128": { "hi": 0, - "lo": 1 + "lo": 1000 } } ] @@ -134,7 +109,7 @@ { "i128": { "hi": 0, - "lo": 1 + "lo": 1000 } } ] @@ -148,81 +123,23 @@ ], [ [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - { - "function": { - "contract_fn": { - "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "function_name": "transfer", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 10000 - } - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", { "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "function_name": "deposit", + "function_name": "set_loan_manager", "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, { "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" }, { - "i128": { - "hi": 0, - "lo": 1000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" } ] } }, - "sub_invocations": [ - { - "function": { - "contract_fn": { - "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "function_name": "transfer", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 1000 - } - } - ] - } - }, - "sub_invocations": [] - } - ] + "sub_invocations": [] } ] ], @@ -235,18 +152,15 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "function_name": "withdraw", + "function_name": "record_yield", "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, { "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" }, { "i128": { "hi": 0, - "lo": 1000 + "lo": 100 } } ] @@ -256,6 +170,8 @@ } ] ], + [], + [], [] ], "ledger": { @@ -329,6 +245,38 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -368,7 +316,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary" @@ -383,7 +331,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary", @@ -523,7 +471,7 @@ "val": { "i128": { "hi": 0, - "lo": 1 + "lo": 1000 } } } @@ -583,6 +531,21 @@ "u32": 1 } }, + { + "key": { + "vec": [ + { + "symbol": "LoanManager" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, { "key": { "vec": [ @@ -609,7 +572,7 @@ "val": { "i128": { "hi": 0, - "lo": 1 + "lo": 1000 } } }, @@ -627,7 +590,7 @@ "val": { "i128": { "hi": 0, - "lo": 1 + "lo": 1100 } } }, @@ -645,7 +608,7 @@ "val": { "i128": { "hi": 0, - "lo": 1 + "lo": 1000 } } }, @@ -689,40 +652,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "key": { - "ledger_key_nonce": { - "nonce": 2032731177588607455 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "key": { - "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary" @@ -737,7 +667,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -753,12 +683,8 @@ { "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 - } - }, - "durability": "temporary" + "key": "ledger_key_contract_instance", + "durability": "persistent" } }, [ @@ -768,18 +694,21 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null } - }, - "durability": "temporary", - "val": "void" + } } }, "ext": "v0" }, - 6311999 + 4095 ] ], [ @@ -788,7 +717,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 1 } }, "durability": "temporary" @@ -803,7 +732,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 1 } }, "durability": "temporary", @@ -859,7 +788,7 @@ "val": { "i128": { "hi": 0, - "lo": 10001 + "lo": 1000 } } }, @@ -961,79 +890,6 @@ 518400 ] ], - [ - { - "contract_data": { - "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - } - ] - }, - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000 - } - } - }, - { - "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" - }, - "val": { - "bool": false - } - } - ] - } - } - }, - "ext": "v0" - }, - 518400 - ] - ], [ { "contract_data": { diff --git a/lending_pool/test_snapshots/test/test_set_loan_manager_requires_admin.1.json b/lending_pool/test_snapshots/test/test_set_loan_manager_requires_admin.1.json new file mode 100644 index 0000000..42cc9bb --- /dev/null +++ b/lending_pool/test_snapshots/test/test_set_loan_manager_requires_admin.1.json @@ -0,0 +1,351 @@ +{ + "generators": { + "address": 5, + "nonce": 1 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 1440 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/loan_manager/src/lib.rs b/loan_manager/src/lib.rs index a80aa45..d1a9121 100644 --- a/loan_manager/src/lib.rs +++ b/loan_manager/src/lib.rs @@ -26,6 +26,8 @@ pub trait RateOracleInterface { pub trait LendingPoolInterface { fn is_paused(env: Env) -> bool; fn pool_balance(env: Env, token: Address) -> i128; + fn record_yield(env: Env, token: Address, amount: i128); + fn get_loan_manager(env: Env, token: Address) -> Option
; } mod events; @@ -521,6 +523,28 @@ impl LoanManager { Self::bump_instance_ttl(env); } + /// Credit realized yield (loan interest, late fees, extension fees) to the + /// lending pool's LP share price. + /// + /// Since the pool now derives share value from internally-tracked managed + /// assets rather than its raw balance (lending_pool issue #2), interest that + /// is merely transferred into the pool would otherwise sit as uncounted + /// surplus and never reach depositors. This reports it explicitly. + /// + /// Best-effort and non-fatal: it only calls the pool when this manager is the + /// pool's configured yield reporter (otherwise the pool would reject the call + /// and revert the repayment), and it swallows any pool-side error (e.g. no LP + /// shares outstanding) so yield accounting can never block a repayment. + fn report_yield_to_pool(env: &Env, lending_pool: &Address, token: &Address, amount: i128) { + if amount <= 0 { + return; + } + let pool_client = PoolClient::new(env, lending_pool); + if pool_client.get_loan_manager(token) == Some(env.current_contract_address()) { + let _ = pool_client.try_record_yield(token, &amount); + } + } + fn borrower_loan_count(env: &Env, borrower: &Address) -> u32 { let key = DataKey::BorrowerLoanCount(borrower.clone()); if env.storage().persistent().has(&key) { @@ -1326,6 +1350,14 @@ impl LoanManager { let token_client = TokenClient::new(&env, &token); token_client.transfer(&borrower, &lending_pool, &amount); + // The interest and late-fee portions of the repayment are yield to LPs; + // the principal portion just returns borrowed principal. Credit only the + // yield so the pool's share price reflects earnings (lending_pool #2). + let yield_portion = interest_payment + .checked_add(late_fee_payment) + .expect("yield portion overflow"); + Self::report_yield_to_pool(&env, &lending_pool, &token, yield_portion); + if completed { // release_collateral_internal reads collateral from storage and performs // its own CEI, so it is safe to call after the loan state is committed. @@ -1554,6 +1586,14 @@ impl LoanManager { if debt_repaid > 0 { token_client.transfer(&env.current_contract_address(), &lending_pool, &debt_repaid); + // NOTE: liquidation yield (recovered interest/late fees) is NOT + // reported to the pool here. Unlike a normal repayment, a liquidation + // can also leave a principal shortfall, and crediting the recovered + // interest as yield without a paired principal write-off would + // *inflate* LP share value during a loss event. Correct handling + // needs a `record_loss` companion in the pool; tracked as a + // follow-up to lending_pool #2. Recovered funds still sit in the pool + // as (uncounted) surplus, which is conservative/safe for LPs. } if liquidator_bonus > 0 { token_client.transfer( @@ -2449,6 +2489,10 @@ impl LoanManager { .expect("lending pool not set"); let token_client = TokenClient::new(&env, &token); token_client.transfer(&borrower, &lending_pool, &extension_fee); + + // The extension fee is pure income to the pool — credit it as yield + // so it accrues to LP share value (lending_pool #2). + Self::report_yield_to_pool(&env, &lending_pool, &token, extension_fee); } // Extend the due date diff --git a/loan_manager/src/test.rs b/loan_manager/src/test.rs index 4cc0781..b08589a 100644 --- a/loan_manager/src/test.rs +++ b/loan_manager/src/test.rs @@ -3032,3 +3032,121 @@ fn test_approve_loan_uses_borrower_requested_term_not_default() { "due_date must be derived from the borrower-requested term" ); } + +// ── Issue #2: repaid interest reaches LPs via record_yield ────────────────── + +#[test] +fn test_repayment_interest_credited_to_pool_lps() { + // End-to-end: once the pool derives share value from managed assets + // (lending_pool #2), repaid interest must still reach LPs automatically. + // The loan manager reports the interest portion via record_yield. + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (manager, nft_client, pool_addr, token_id, _admin) = setup_test(&env); + let pool_client = LendingPoolClient::new(&env, &pool_addr); + + // Wire the pool to accept yield reports from this loan manager. + pool_client.set_loan_manager(&token_id, &manager.address); + pool_client.set_withdrawal_cooldown(&0); + + let stellar_token = StellarAssetClient::new(&env, &token_id); + + // An LP supplies real liquidity, so LP shares exist. + let lp = Address::generate(&env); + stellar_token.mint(&lp, &10_000); + pool_client.deposit(&lp, &token_id, &10_000); + assert_eq!(pool_client.get_total_managed_assets(&token_id), 10_000); + assert_eq!(pool_client.get_deposit(&lp, &token_id), 10_000); + + // Borrower with a passing score. + let borrower = Address::generate(&env); + let history_hash = soroban_sdk::BytesN::from_array(&env, &[0u8; 32]); + nft_client.mint( + &borrower, + &600, + &history_hash, + &String::from_str(&env, "ipfs://QmTest"), + &None, + ); + stellar_token.mint(&borrower, &10_000); + + // Start from a non-zero ledger so interest accrual is active (a zero + // last_interest_ledger is treated as "not started"). + env.ledger().set_sequence_number(1_000); + + // Disburse a loan and let a full term of interest accrue. + let loan_id = manager.request_loan(&borrower, &1_000, &17_280); + manager.approve_loan(&loan_id); + env.ledger() + .set_sequence_number(env.ledger().sequence() + 17_280); + + let loan = manager.get_loan(&loan_id); + assert!(loan.accrued_interest > 0, "interest should have accrued"); + let total_debt = loan.amount + loan.accrued_interest + loan.accrued_late_fee + - loan.principal_paid + - loan.interest_paid + - loan.late_fee_paid; + + manager.repay(&borrower, &loan_id, &total_debt); + assert_eq!(manager.get_loan(&loan_id).status, LoanStatus::Repaid); + + // The interest portion is now reflected in LP share value automatically. + let managed = pool_client.get_total_managed_assets(&token_id); + assert!( + managed > 10_000, + "managed assets should grow by the repaid interest" + ); + // The single LP owns every share, so their redeemable value equals managed. + assert_eq!(pool_client.get_deposit(&lp, &token_id), managed); + // Principal tracking is unaffected by yield. + assert_eq!(pool_client.get_total_deposits(&token_id), 10_000); +} + +#[test] +fn test_repayment_succeeds_when_pool_reporter_not_configured() { + // If the pool has not authorized this manager as a yield reporter, repayment + // must still succeed (yield reporting is best-effort and never blocks a + // repayment); the interest simply sits as uncounted pool surplus. + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (manager, nft_client, pool_addr, token_id, _admin) = setup_test(&env); + let pool_client = LendingPoolClient::new(&env, &pool_addr); + // NOTE: deliberately NOT calling set_loan_manager. + + let stellar_token = StellarAssetClient::new(&env, &token_id); + let lp = Address::generate(&env); + stellar_token.mint(&lp, &10_000); + pool_client.set_withdrawal_cooldown(&0); + pool_client.deposit(&lp, &token_id, &10_000); + + let borrower = Address::generate(&env); + let history_hash = soroban_sdk::BytesN::from_array(&env, &[0u8; 32]); + nft_client.mint( + &borrower, + &600, + &history_hash, + &String::from_str(&env, "ipfs://QmTest"), + &None, + ); + stellar_token.mint(&borrower, &10_000); + + env.ledger().set_sequence_number(1_000); + + let loan_id = manager.request_loan(&borrower, &1_000, &17_280); + manager.approve_loan(&loan_id); + env.ledger() + .set_sequence_number(env.ledger().sequence() + 17_280); + + let loan = manager.get_loan(&loan_id); + let total_debt = loan.amount + loan.accrued_interest + loan.accrued_late_fee + - loan.principal_paid + - loan.interest_paid + - loan.late_fee_paid; + manager.repay(&borrower, &loan_id, &total_debt); + + assert_eq!(manager.get_loan(&loan_id).status, LoanStatus::Repaid); + // Reporter not configured → managed assets unchanged (interest is surplus). + assert_eq!(pool_client.get_total_managed_assets(&token_id), 10_000); +} diff --git a/loan_manager/test_snapshots/test/test_approve_loan_uses_borrower_requested_term_not_default.1.json b/loan_manager/test_snapshots/test/test_approve_loan_uses_borrower_requested_term_not_default.1.json index 57c1218..67649d2 100644 --- a/loan_manager/test_snapshots/test/test_approve_loan_uses_borrower_requested_term_not_default.1.json +++ b/loan_manager/test_snapshots/test/test_approve_loan_uses_borrower_requested_term_not_default.1.json @@ -739,7 +739,7 @@ ] }, "val": { - "u32": 3 + "u32": 4 } }, { diff --git a/loan_manager/test_snapshots/test/test_quote_total_debt_matches_repay.1.json b/loan_manager/test_snapshots/test/test_quote_total_debt_matches_repay.1.json new file mode 100644 index 0000000..dfe4953 --- /dev/null +++ b/loan_manager/test_snapshots/test/test_quote_total_debt_matches_repay.1.json @@ -0,0 +1,1855 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "authorize_minter", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "set_min_repayment_amount", + "args": [ + { + "i128": { + "hi": 0, + "lo": 0 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 600 + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "string": "ipfs://QmTest" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "request_loan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u32": 17280 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "approve_loan", + "args": [ + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ], + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "repay", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 20000, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "history_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "metadata_uri" + }, + "val": { + "string": "ipfs://QmTest" + } + }, + { + "key": { + "symbol": "score" + }, + "val": { + "u32": 610 + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 20000 + } + }, + { + "key": { + "symbol": "new_score" + }, + "val": { + "u32": 610 + } + }, + { + "key": { + "symbol": "old_score" + }, + "val": { + "u32": 600 + } + }, + { + "key": { + "symbol": "reason" + }, + "val": { + "symbol": "ADJ" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + 538400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "ADMIN" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "BURNTHR" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRepaymentAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 1440 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accrued_interest" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "accrued_late_fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "borrower" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "collateral_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "due_date" + }, + "val": { + "u32": 17280 + } + }, + { + "key": { + "symbol": "extension_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "interest_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "interest_rate_bps" + }, + "val": { + "u32": 1200 + } + }, + { + "key": { + "symbol": "interest_residual" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "last_interest_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "last_late_fee_ledger" + }, + "val": { + "u32": 21600 + } + }, + { + "key": { + "symbol": "late_fee_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "principal_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Repaid" + } + ] + } + }, + { + "key": { + "symbol": "term_ledgers" + }, + "val": { + "u32": 17280 + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BorrowerLoans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "DefaultWindowLedgers" + } + ] + }, + "val": { + "u32": 17280 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GracePeriodLedgers" + } + ] + }, + "val": { + "u32": 4320 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LateFeeRateBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LendingPool" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationBonusBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationThresholdBps" + } + ] + }, + "val": { + "u32": 15000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LoanCounter" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoanAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 50000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoansPerBorrower" + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxRateBps" + } + ] + }, + "val": { + "u32": 100000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRateBps" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NftContract" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalOutstanding" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6331999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 538400 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 538400 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 140960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/loan_manager/test_snapshots/test/test_repayment_interest_credited_to_pool_lps.1.json b/loan_manager/test_snapshots/test/test_repayment_interest_credited_to_pool_lps.1.json new file mode 100644 index 0000000..152c064 --- /dev/null +++ b/loan_manager/test_snapshots/test/test_repayment_interest_credited_to_pool_lps.1.json @@ -0,0 +1,2312 @@ +{ + "generators": { + "address": 8, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "authorize_minter", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "set_min_repayment_amount", + "args": [ + { + "i128": { + "hi": 0, + "lo": 0 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_loan_manager", + "args": [ + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u32": 600 + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "string": "ipfs://QmTest" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "request_loan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u32": 17280 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "approve_loan", + "args": [ + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ], + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "repay", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u32": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1120 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1120 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 18280, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "history_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "metadata_uri" + }, + "val": { + "string": "ipfs://QmTest" + } + }, + { + "key": { + "symbol": "score" + }, + "val": { + "u32": 611 + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "new_score" + }, + "val": { + "u32": 611 + } + }, + { + "key": { + "symbol": "old_score" + }, + "val": { + "u32": 600 + } + }, + { + "key": { + "symbol": "reason" + }, + "val": { + "symbol": "ADJ" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "ADMIN" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "BURNTHR" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRepaymentAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "DepositorCount" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LoanManager" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10120 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 519400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accrued_interest" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "accrued_late_fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "borrower" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "collateral_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "due_date" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "extension_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "interest_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 120 + } + } + }, + { + "key": { + "symbol": "interest_rate_bps" + }, + "val": { + "u32": 1200 + } + }, + { + "key": { + "symbol": "interest_residual" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "last_interest_ledger" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "last_late_fee_ledger" + }, + "val": { + "u32": 22600 + } + }, + { + "key": { + "symbol": "late_fee_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "principal_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Repaid" + } + ] + } + }, + { + "key": { + "symbol": "term_ledgers" + }, + "val": { + "u32": 17280 + } + } + ] + } + } + }, + "ext": "v0" + }, + 519400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BorrowerLoans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "DefaultWindowLedgers" + } + ] + }, + "val": { + "u32": 17280 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GracePeriodLedgers" + } + ] + }, + "val": { + "u32": 4320 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LateFeeRateBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LendingPool" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationBonusBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationThresholdBps" + } + ] + }, + "val": { + "u32": 15000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LoanCounter" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoanAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 50000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoansPerBorrower" + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxRateBps" + } + ] + }, + "val": { + "u32": 100000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRateBps" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NftContract" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalOutstanding" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6330279 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 10120 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 9880 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 139240 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/loan_manager/test_snapshots/test/test_repayment_succeeds_when_pool_reporter_not_configured.1.json b/loan_manager/test_snapshots/test/test_repayment_succeeds_when_pool_reporter_not_configured.1.json new file mode 100644 index 0000000..2c033aa --- /dev/null +++ b/loan_manager/test_snapshots/test/test_repayment_succeeds_when_pool_reporter_not_configured.1.json @@ -0,0 +1,2238 @@ +{ + "generators": { + "address": 8, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "authorize_minter", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "set_min_repayment_amount", + "args": [ + { + "i128": { + "hi": 0, + "lo": 0 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_withdrawal_cooldown", + "args": [ + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "deposit", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u32": 600 + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "string": "ipfs://QmTest" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "request_loan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u32": 17280 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "approve_loan", + "args": [ + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ], + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "repay", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "u32": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1120 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1120 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 18280, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "AuthorizedMinter" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "Metadata" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "history_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "metadata_uri" + }, + "val": { + "string": "ipfs://QmTest" + } + }, + { + "key": { + "symbol": "score" + }, + "val": { + "u32": 611 + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "ScoreHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "new_score" + }, + "val": { + "u32": 611 + } + }, + { + "key": { + "symbol": "old_score" + }, + "val": { + "u32": 600 + } + }, + { + "key": { + "symbol": "reason" + }, + "val": { + "symbol": "ADJ" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "ADMIN" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "BURNTHR" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRepaymentAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "DepositTimestamp" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Shares" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "DepositorCount" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDeposits" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalManagedAssets" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalShares" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WithdrawalCooldown" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "BorrowerLoanCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 0 + } + } + }, + "ext": "v0" + }, + 519400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Loan" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accrued_interest" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "accrued_late_fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "borrower" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "collateral_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "due_date" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "extension_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "interest_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 120 + } + } + }, + { + "key": { + "symbol": "interest_rate_bps" + }, + "val": { + "u32": 1200 + } + }, + { + "key": { + "symbol": "interest_residual" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "last_interest_ledger" + }, + "val": { + "u32": 18280 + } + }, + { + "key": { + "symbol": "last_late_fee_ledger" + }, + "val": { + "u32": 22600 + } + }, + { + "key": { + "symbol": "late_fee_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "principal_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Repaid" + } + ] + } + }, + { + "key": { + "symbol": "term_ledgers" + }, + "val": { + "u32": 17280 + } + } + ] + } + } + }, + "ext": "v0" + }, + 519400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "BorrowerLoans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "DefaultWindowLedgers" + } + ] + }, + "val": { + "u32": 17280 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GracePeriodLedgers" + } + ] + }, + "val": { + "u32": 4320 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LateFeeRateBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LendingPool" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationBonusBps" + } + ] + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LiquidationThresholdBps" + } + ] + }, + "val": { + "u32": 15000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "LoanCounter" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoanAmount" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 50000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxLoansPerBorrower" + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxRateBps" + } + ] + }, + "val": { + "u32": 100000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinRateBps" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "NftContract" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Paused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalOutstanding" + }, + { + "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 4 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6330279 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312999 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 10120 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "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": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 9880 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 536680 + ] + ], + [ + { + "contract_data": { + "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 139240 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 518400 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file