diff --git a/contract/src/lib.rs b/contract/src/lib.rs index fa249f7..40b67ab 100644 --- a/contract/src/lib.rs +++ b/contract/src/lib.rs @@ -1,2444 +1,4899 @@ -#![no_std] -#![allow(clippy::too_many_arguments, clippy::inconsistent_digit_grouping)] - -#[cfg(test)] -extern crate std; - -mod admin; -mod batch; -#[cfg(feature = "bench")] -mod bench; -mod charge_exec; -mod errors; -mod events; -mod fee; -mod grace; -mod merchant_stats; -mod migration; -mod min_interval; -mod referral; -mod spending_limit; -mod storage; -mod subscription_count; -mod subscription_history; -mod subscription_metadata; -mod test; -mod test_migration; -mod trial; -mod upgrade; -mod validation; -mod whitelist; - -use crate::errors::ContractError; -use soroban_sdk::{ - contract, contractimpl, contracttype, token, Address, BytesN, Env, String, Symbol, Vec, -}; - -pub use batch::ChargeResult; -pub use batch::CancelResult; -pub use charge_exec::ChargeSimResult; -pub use charge_exec::PayPerUseSimResult; - -// ───────────────────────────────────────────────────────────── -// Storage keys -// ───────────────────────────────────────────────────────────── - -#[contracttype] -#[derive(Clone)] -pub enum DataKey { - Subscription(Address), - Token, - // Admin - Admin, - // Grace period - GracePeriod, - // Merchant whitelist - MerchantWhitelist(Address), - WhitelistEnabled, - WhitelistIndex(u32), - WhitelistIndexSize, - // Merchant freeze: blocks new subscriptions, independent of whitelist status - MerchantFrozen(Address), - MerchantFreezeReason(Address), - // Protocol fee - FeeCollector, - FeeBps, - // Feature: subscription count - ActiveCount, - // Feature: merchant revenue stats - MerchantRevenue(Address), - // Per-day merchant revenue buckets (keyed by Unix day) - MerchantRevenueDay(Address, u64), - // Index of which days have revenue buckets for a merchant - MerchantRevenueDayIndex(Address), - // Feature: daily spending limits (temporary storage) - DailyLimit(Address), - DailySpent(Address), - DayStart(Address), - // Feature: referral tracking - Referral(Address), - // Feature: state migration - SchemaVersion, - // Feature: subscription metadata labels - SubscriptionMeta(Address), - // Feature: charge history - ChargeHistory(Address), - // Feature: global volume cap - GlobalVolumeWindow, - // Feature: batch size limit override - MaxBatchSize, - // Feature: contract pause - ContractPaused, - // Feature: minimum subscription interval floor - MinInterval, - // Feature: consolidated merchant revenue history (Vec) - MerchantRevenueHistory(Address), - // Feature: subscriber index (append-only log) - SubscriberIndex(u64), - SubscriberIndexSize, - // Reverse lookup of a subscriber's slot, used to prune on cancel - SubscriberIndexSlot(Address), - // Tombstone marking a pruned (cancelled) subscriber index slot - SubscriberIndexRemoved(u64), - // Feature: per-merchant subscriber count - MerchantSubCount(Address), - // Feature: merchant index for governance/ranking - MerchantIndex(u32), - MerchantIndexSize, - MerchantKnown(Address), - // Pending admin for two-step transfer - PendingAdmin, - // Two-step auth for protocol fee - PendingFee, - // Per-merchant custom fee recipient (merchant -> destination) - MerchantFeeRecipient(Address), - // Two-step auth for grace period - PendingGracePeriod, - // Two-step auth for upgrade - PendingUpgrade, - // Feature: pause expiry (bounded pause with auto-resume) - PauseExpiry(Address), - // Feature: cumulative protocol fees collected across all merchants - TotalProtocolFees, - // Feature: configurable global hourly volume cap override - GlobalVolumeCapOverride, - // Feature: configurable min/max fee bps bounds - MinFeeBps, - MaxFeeBps, - // Feature: configurable whitelist batch size limit override - MaxWhitelistBatchSize, -} - -// ───────────────────────────────────────────────────────────── -// Constants -// ───────────────────────────────────────────────────────────── - -pub const SUBSCRIPTION_TTL_LEDGERS: u32 = 6307200; // ~1 year (assuming 5s blocks) -pub const MAX_BATCH_PAUSE_SUBSCRIPTIONS: u32 = 25; -/// Default cap for the admin whitelist batch entrypoints. Overridable at -/// runtime via `set_max_whitelist_batch_size`, bounded by `MAX_BATCH_SIZE_CEILING`. -pub const MAX_WHITELIST_BATCH_SIZE: u32 = 50; -/// Hard ceiling shared by every admin-configurable batch limit. Configured -/// limits are never allowed above this value, so batches stay bounded even if -/// an admin key is compromised. -pub const MAX_BATCH_SIZE_CEILING: u32 = 200; -pub const GLOBAL_MAX_VOLUME_PER_HOUR: i128 = 50_000_000_000_000; // 50 trillion stroops -pub const HOUR_IN_SECONDS: u64 = 3600; -pub const MAX_AMOUNT: i128 = 100_000_000_000; -pub const MAX_SUBSCRIPTION_AMOUNT: i128 = 100_000_000_000_000; - -// ───────────────────────────────────────────────────────────── -// Data types -// ───────────────────────────────────────────────────────────── - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct Subscription { - pub merchant: Address, - pub amount: i128, - pub interval: u64, - pub last_charged: u64, - pub active: bool, - pub paused: bool, // true if paused, false otherwise - pub token: Address, // SAC token used for this subscription - pub referrer: Option
, // optional referral address - pub label: Symbol, // user-assigned label for this subscription - pub trial_duration: u64, // optional trial duration in seconds - pub created_at: u64, // timestamp of subscription creation -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct SubscriptionHealth { - pub active: bool, - pub charge_due: bool, - pub within_grace: bool, - pub has_sufficient_allowance: bool, - pub is_paused: bool, - pub trial_active: bool, - pub daily_limit_set: bool, -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct DailyLimitStatus { - pub limit: Option, - pub spent: i128, - pub day_start: Option, - pub remaining: Option, -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct HealthReport { - pub is_healthy: bool, - pub contract_paused: bool, - pub token_configured: bool, - pub admin_configured: bool, - /// Approximate instance TTL in ledgers. On-chain, this is a hardcoded - /// lower-bound estimate (100_000) because Soroban does not expose - /// `get_ttl()` outside test builds. Do not treat as precise. - pub instance_ttl_ledgers: u32, - pub active_subscription_count: u64, - pub schema_version: u32, - pub fee_collector_set: bool, - pub global_volume_utilization_pct: u32, - /// Number of merchants with unwithdrawn revenue > 0. - pub pending_merchant_rev_count: u32, -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct GlobalVolumeWindow { - pub current_window_start: u64, - pub accumulated_volume: i128, -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct ProtocolStats { - pub active_count: u64, - pub fee_bps: u32, - pub fee_collector: Option
, - pub grace_period: u64, - pub whitelist_enabled: bool, - pub schema_version: u32, - pub contract_paused: bool, -} - -#[contracttype] -#[derive(Clone, Debug, PartialEq)] -pub struct ContractConfig { - pub fee_bps: u32, - pub fee_collector: Option
, - pub grace_period: u64, - pub min_interval: u64, - pub max_batch_size: u32, - pub global_volume_cap: i128, - pub whitelist_enabled: bool, - pub paused: bool, - pub schema_version: u32, -} - -// ───────────────────────────────────────────────────────────── -// Contract -// ───────────────────────────────────────────────────────────── - -pub(crate) fn cancel_inner(env: &Env, user: &Address) -> Subscription { - let key = DataKey::Subscription(user.clone()); - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - sub.active = false; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(env, user); - - subscription_count::decrement(env); - subscription_count::remove_subscriber_index(env, user); - merchant_stats::decrement_subscriber_count(env, &sub.merchant); - referral::remove_referral(env, user); - - sub -} - -#[contract] -pub struct FlowPay; - -#[contractimpl] -impl FlowPay { - /// One-time deploy entrypoint: persists the default SAC token and the - /// contract admin. Admin must authorize this invoke. - /// - /// Deploy scripts (`scripts/deploy-pipeline.ts`, `scripts/testnet-setup.ts`) - /// depend on these invariants: - /// - arity is `initialize(token, admin)` - /// - a second call returns typed `ContractError::AlreadyInitialized` (code 1) - /// - success stores both token and admin, readable via `get_token` / `get_admin` - pub fn initialize(env: Env, token: Address, admin: Address) { - bump_instance_ttl(&env); - - if env.storage().instance().has(&DataKey::Token) { - env.panic_with_error(ContractError::AlreadyInitialized); - } - - // Authorize and persist admin before writing Token so a missing/invalid - // admin signature cannot leave a token-only (partial) initialization. - admin::initialize_admin(&env, &admin); - env.storage().instance().set(&DataKey::Token, &token); - } - - /// Permissionlessly refreshes the shared instance storage TTL. - /// - /// Keeper liveness probes may call this entrypoint during read- or - /// simulation-heavy periods. It does not require auth, inspect pause - /// state, transfer funds, or mutate protocol state. - pub fn bump_instance_ttl(env: Env) { - bump_instance_ttl(&env); - } - - pub fn get_max_batch_size(env: Env) -> u32 { - batch::get_max_batch_size(&env) - } - - pub fn set_max_batch_size(env: Env, size: u32) { - admin::require_admin(&env); - if size > MAX_BATCH_SIZE_CEILING { - env.panic_with_error(ContractError::InvalidBatchSize); - } - env.storage().instance().set(&DataKey::MaxBatchSize, &size); - } - - /// Returns the batch cap applied to the admin whitelist batch entrypoints - /// (`whitelist_batch_add`, `whitelist_batch_remove`, `get_merchant_statuses`). - /// - /// This is a **separate** knob from `get_max_batch_size`, which bounds the - /// charge batches — see the design note in `whitelist.rs`. Defaults to - /// `MAX_WHITELIST_BATCH_SIZE` (50). - pub fn get_max_whitelist_batch_size(env: Env) -> u32 { - whitelist::get_max_whitelist_batch_size(&env) - } - - /// Admin-only: overrides the whitelist batch cap. - /// - /// Panics with `InvalidBatchSize` when `size` is zero or exceeds - /// `MAX_BATCH_SIZE_CEILING` (200), so whitelist batches always stay bounded. - pub fn set_max_whitelist_batch_size(env: Env, size: u32) { - admin::require_admin(&env); - whitelist::set_max_whitelist_batch_size(&env, size); - } - - pub fn get_contract_config(env: Env) -> ContractConfig { - ContractConfig { - fee_bps: fee::get_fee_bps(&env), - fee_collector: fee::get_fee_collector(&env), - grace_period: grace::get_grace_period(&env), - min_interval: min_interval::get_min_interval(&env), - max_batch_size: batch::get_max_batch_size(&env), - global_volume_cap: GLOBAL_MAX_VOLUME_PER_HOUR, - whitelist_enabled: whitelist::is_whitelist_enabled(&env), - paused: is_contract_paused(&env), - schema_version: env - .storage() - .instance() - .get(&DataKey::SchemaVersion) - .unwrap_or(1), - } - } - - /// Dry-run estimate of a `batch_charge` call. Returns one `ChargeResult` - /// per input user using the same decision logic as the live path, but - /// **never** performs state writes, token transfers, or fee collection. - /// - /// Share one precheck with `simulate_charge`: both callers route through - /// `charge_exec::dry_run_skip_precheck` so they agree on skip/pause/grace/ - /// inactive/not-due outcomes. See the design-comment block in - /// `charge_exec.rs` at `DryRunSkipOutcome` for the full list of intentional - /// differences (return enums, allowance handling deferred to Issue 001, - /// etc.). - /// - /// Non-goals (Issue 005 scope boundaries — do NOT expand): - /// * Allowance / InsufficientAllowance redesign → Issue 001. - /// * Volume-cap precheck redesign → separate issue. - pub fn get_batch_charge_estimate(env: Env, users: Vec
) -> Vec { - if users.len() > 200 { - env.panic_with_error(ContractError::BatchTooLarge); - } - let mut results: Vec = Vec::new(&env); - - for user in users.iter() { - let key = DataKey::Subscription(user.clone()); - let sub_opt: Option = env.storage().persistent().get(&key); - - let (outcome, sub_after_precheck) = - charge_exec::dry_run_skip_precheck(&env, &user, sub_opt, true); - - let result = if let charge_exec::DryRunSkipOutcome::ProceedToAllowance = outcome { - let sub = sub_after_precheck - .expect("sub present when dry_run_precheck returns ProceedToAllowance"); - if !validation::has_sufficient_allowance(&env, &user, &sub.token, sub.amount) { - ChargeResult::AllowanceInsufficient - } else { - ChargeResult::Charged - } - } else { - outcome.into_batch_result() - }; - - results.push_back(result); - } - results - } - - /// Creates or replaces a recurring subscription for `user`. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - `merchant`: Recipient that receives recurring and pay-per-use transfers. - /// - `amount`: Amount transferred per billing period. Must be greater than zero. - /// - `interval`: Billing cadence in seconds. Must be greater than zero. - /// - `token`: Stellar Asset Contract used for this subscription. - /// - `trial_period`: Optional seconds to delay the first charge. - /// - `referrer`: Optional referrer stored for the subscriber. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if the contract is paused, the merchant whitelist rejects `merchant`, - /// `amount` or `interval` is zero, or the contract allowance is below `amount`. - /// - /// # Side Effects - /// - /// Stores the subscription, refreshes its TTL, updates active subscription - /// count and referral storage, and emits `subscribed`. - pub fn subscribe( - env: Env, - user: Address, - merchant: Address, - amount: i128, - interval: u64, - token: Address, - trial_period: Option, - referrer: Option
, - ) { - subscribe_inner( - &env, - user, - merchant, - amount, - interval, - token, - trial_period, - referrer, - ); - } - - pub fn subscribe_with_metadata( - env: Env, - user: Address, - merchant: Address, - amount: i128, - interval: u64, - token: Address, - trial_period: Option, - referrer: Option
, - label: String, - ) { - if label.len() > 64 { - env.panic_with_error(ContractError::MetadataLabelTooLong); - } - - subscribe_inner( - &env, - user.clone(), - merchant, - amount, - interval, - token, - trial_period, - referrer, - ); - - let _ = subscription_metadata::set_metadata(&env, &user, label); - } - - /// Charges the next due recurring payment for `user`. - /// - /// # Parameters - /// - /// - `user`: Subscriber whose active subscription should be charged. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// No subscriber signature is required. The contract spends through the - /// previously granted token allowance. - /// - /// # Errors - /// - /// Panics if the contract is paused, no subscription exists, the subscription - /// is inactive or paused, the interval has not elapsed, the grace period has - /// elapsed, or token transfer authorization/allowance is insufficient. - /// - /// # Side Effects - /// - /// Transfers `amount` from `user` to the merchant, records merchant revenue - /// and charge history, refreshes subscription TTL, updates `last_charged`, - /// and emits `charged`. - pub fn charge(env: Env, user: Address) { - bump_instance_ttl(&env); - migration::require_current_version(&env); - ensure_contract_not_paused(&env); - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - let now = env.ledger().timestamp(); - - if sub.paused { - if charge_exec::try_auto_resume(&env, &user, &mut sub, now) { - // Auto-resumed; fall through to charge immediately - } else { - env.panic_with_error(ContractError::SubscriptionPaused); - } - } else if !sub.active { - env.panic_with_error(ContractError::SubscriptionInactive); - } - - let next = charge_exec::compute_next_charge_at(&sub) - .unwrap_or_else(|| env.panic_with_error(ContractError::SubscriptionPaused)); - - if now < next { - env.panic_with_error(ContractError::IntervalNotElapsed); - } - - let grace_period = grace::get_grace_period(&env); - if grace_period > 0 && now > next + grace_period { - env.panic_with_error(ContractError::GracePeriodElapsed); - } - - charge_exec::execute_charge(&env, &user, &key, &mut sub, now); - } - - pub fn extend_subscription_ttl(env: Env, user: Address) { - extend_subscription_ttl(&env, &user); - } - - /// Permissionlessly refreshes the TTL of any subscription entry. - /// Returns early (no-op) if no subscription exists for `user`. - /// No auth required — safe for keeper bots to call for dormant subscribers. - pub fn bump_subscription(env: Env, user: Address) { - extend_subscription_ttl(&env, &user); - } - - /// Bumps TTL for multiple subscription entries in a single call. - /// Returns a list of addresses whose TTLs were actually extended. - pub fn batch_extend_subscription_ttl(env: Env, users: Vec
) -> Vec
{ - batch::batch_extend_subscription_ttl(&env, users) - } - - /// Dry-run simulation of a charge call. Returns ChargeSimResult variant indicating - /// whether charge would succeed or the reason it would fail. - pub fn simulate_charge(env: Env, user: Address) -> ChargeSimResult { - charge_exec::simulate_charge(&env, user) - } - - /// Dry-run simulation of a `pay_per_use` call. Returns a PayPerUseSimResult - /// variant indicating whether the pay-per-use would succeed or the reason it - /// would fail (contract paused, invalid/inactive/paused subscription, daily - /// limit exceeded, or insufficient allowance). Performs no state writes. - pub fn simulate_pay_per_use(env: Env, user: Address, amount: i128) -> PayPerUseSimResult { - charge_exec::simulate_pay_per_use(&env, user, amount, None) - } - - /// Dry-run simulation of a `pay_per_use_to` call. Mirrors - /// `simulate_pay_per_use` but also validates the `recipient` (contract-address - /// self-reference and merchant whitelist). Performs no state writes. - pub fn simulate_pay_per_use_to( - env: Env, - user: Address, - amount: i128, - recipient: Address, - ) -> PayPerUseSimResult { - charge_exec::simulate_pay_per_use(&env, user, amount, Some(recipient)) - } - - /// Executes an immediate pay-per-use charge for an active subscription. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - `amount`: One-time amount to transfer. Must be greater than zero. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if the contract is paused, `amount` is zero, no subscription - /// exists, the subscription is inactive or paused, the daily spending limit - /// would be exceeded, or token transfer authorization/allowance is insufficient. - /// - /// # Side Effects - /// - /// Transfers `amount` to the subscription merchant, updates merchant revenue - /// and daily spend tracking, and emits `pay_per_use`. - pub fn pay_per_use(env: Env, user: Address, amount: i128) { - bump_instance_ttl(&env); - migration::require_current_version(&env); - pay_per_use_inner(&env, user, amount, None); - } - - /// Executes an immediate pay-per-use charge for an active subscription, - /// routing payment to `recipient` instead of the subscription's merchant. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - `amount`: One-time amount to transfer. Must be greater than zero. - /// - `recipient`: Address that receives the net payment instead of `sub.merchant`. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Same as `pay_per_use`, plus panics if the merchant whitelist is enabled - /// and `recipient` is not whitelisted. - /// - /// # Side Effects - /// - /// Transfers `amount` to `recipient`, updates `recipient`'s merchant revenue - /// and the user's daily spend tracking (shared with `pay_per_use`), and - /// emits `pay_per_use` with `recipient` in place of `sub.merchant`. - pub fn pay_per_use_to(env: Env, user: Address, amount: i128, recipient: Address) { - migration::require_current_version(&env); - pay_per_use_inner(&env, user, amount, Some(recipient)); - } - - pub fn get_day_start(env: Env, user: Address) -> Option { - spending_limit::get_day_start(&env, &user) - } - - /// Cancels `user`'s active subscription. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if no subscription exists for `user`. - /// - /// # Side Effects - /// - /// Marks the subscription inactive, decrements active subscription count, and - /// emits `cancelled`. - pub fn cancel(env: Env, user: Address) { - bump_instance_ttl(&env); - user.require_auth(); - cancel_inner(&env, &user); - events::publish_cancelled(&env, &user); - } - - /// Extends an active subscription's trial period (or delays next charge) - /// by adding `additional_seconds` to its `last_charged` timestamp. - /// - /// # Panics - /// - If `additional_seconds` is 0 (`IntervalMustBePositive`). - /// - If the subscription is cancelled/inactive (`SubscriptionInactive`). - /// - If the subscription is paused (`SubscriptionPaused`). - /// - If the subscription doesn't exist (`NoSubscriptionFound`). - /// - If `last_charged + additional_seconds` overflows `u64` (`ArithmeticOverflow`). - pub fn extend_trial(env: Env, user: Address, additional_seconds: u64) { - bump_instance_ttl(&env); - user.require_auth(); - trial::extend_trial(&env, &user, additional_seconds); - } - - pub fn cancel_and_refund_prorated(env: Env, user: Address, merchant: Address) { - bump_instance_ttl(&env); - user.require_auth(); - merchant.require_auth(); - - let key = DataKey::Subscription(user.clone()); - let sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - if !sub.active { - env.panic_with_error(ContractError::SubscriptionInactive); - } - if sub.paused { - env.panic_with_error(ContractError::SubscriptionPaused); - } - if sub.merchant != merchant { - env.panic_with_error(ContractError::RefundMerchantMismatch); - } - - let now = env.ledger().timestamp(); - let elapsed = now.saturating_sub(sub.last_charged); - let remaining = sub.interval.saturating_sub(elapsed); - if sub.interval == 0 { - env.panic_with_error(ContractError::IntervalMustBePositive); - } - let refund = (sub.amount * i128::from(remaining)) / i128::from(sub.interval); - - if refund <= 0 { - env.panic_with_error(ContractError::RefundAmountMustBePositive); - } - - // Refunds are merchant-funded; no protocol escrow is used. Validate the - // source balance before the transfer so an underfunded merchant cannot - // reach an opaque SAC failure or a partial cancellation. - let token_client = token::Client::new(&env, &sub.token); - if token_client.balance(&merchant) < refund { - env.panic_with_error(ContractError::InsufficientMerchantBalance); - } - - token_client.transfer(&merchant, &user, &refund); - cancel_inner(&env, &user); - events::publish_cancelled_with_refund(&env, &user, refund); - } - - /// Pauses `user`'s subscription without cancelling it. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if no subscription exists or the subscription is inactive. - /// - /// # Side Effects - /// - /// Sets the subscription `paused` flag and emits `paused`. - pub fn pause(env: Env, user: Address) { - bump_instance_ttl(&env); - user.require_auth(); - - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - if !sub.active { - env.panic_with_error(ContractError::SubscriptionInactive); - } - - sub.paused = true; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(&env, &user); - storage::set_pause_expiry(&env, &user, u64::MAX); - - events::publish_paused(&env, &user); - } - - /// Pauses `user`'s subscription until a specific expiry timestamp. - /// The subscription will auto-resume via `charge` or `batch_charge` - /// when the ledger timestamp reaches `expiry`. - pub fn pause_until(env: Env, user: Address, expiry: u64) { - bump_instance_ttl(&env); - user.require_auth(); - - let now = env.ledger().timestamp(); - if expiry <= now { - env.panic_with_error(ContractError::InvalidPauseExpiry); - } - - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - if !sub.active { - env.panic_with_error(ContractError::SubscriptionNotActive); - } - - sub.paused = true; - sub.active = false; - - env.storage().persistent().set(&key, &sub); - storage::set_pause_expiry(&env, &user, expiry); - - events::publish_paused(&env, &user); - } - - /// Resumes `user`'s paused subscription. - /// - /// # Parameters - /// - /// - `user`: Subscriber address. Must authorize the call. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if no subscription exists or the subscription is inactive. - /// - /// # Side Effects - /// - /// Clears the subscription `paused` flag and emits `resumed`. - pub fn resume(env: Env, user: Address) { - bump_instance_ttl(&env); - user.require_auth(); - - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - // Reject cancelled subscriptions (inactive and not paused). - // pause_until sets active=false while paused=true; those must still be resumable. - if !sub.active && !sub.paused { - env.panic_with_error(ContractError::SubscriptionInactive); - } - - // Recovery rule: if the grace window has closed the subscription is no longer - // chargeable. Resume is rejected to prevent false recoverability signals. - // The only allowed exit is cancel(); re-subscribe to restore chargeability. - // See docs/SUBSCRIBER-LIFECYCLE.md. - if grace::is_grace_lapsed(&env, &sub) { - env.panic_with_error(ContractError::ResumeGraceLapsed); - } - - sub.paused = false; - sub.active = true; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(&env, &user); - storage::clear_pause_expiry(&env, &user); - - events::publish_resumed(&env, &user); - } - - /// Batch-pauses subscriptions for a list of user addresses. - /// - /// Admin-only emergency tool to freeze groups of related accounts in a - /// single transaction. The vector is capped at 25 items to stay within - /// ledger size constraints. - /// - /// # Parameters - /// - /// - `users`: List of subscriber addresses to pause. Max 25 items. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from the contract admin. - /// - /// # Side Effects - /// - /// For every valid active subscription, sets `paused = true`, persists the - /// update, extends the subscription TTL, and emits a `subscription_paused` - /// event. Invalid (non-existent) and already-paused entries are silently - /// skipped. The contract pause flag does **not** block this call. - pub fn batch_pause_subscriptions(env: Env, users: Vec
) { - admin::require_admin(&env); - - let max_batch: u32 = 25; - if users.len() > max_batch { - env.panic_with_error(ContractError::BatchTooLarge); - } - - for user in users.iter() { - let key = DataKey::Subscription(user.clone()); - - let sub_opt: Option = env.storage().persistent().get(&key); - if let Some(mut sub) = sub_opt { - if !sub.active || sub.paused { - if sub.paused { - extend_subscription_ttl(&env, &user); - } - continue; - } - - sub.paused = true; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(&env, &user); - events::publish_subscription_paused(&env, &user); - } - } - } - - pub fn batch_cancel(env: Env, users: Vec
) -> Vec { - admin::require_admin(&env); - batch::batch_cancel(&env, users) - } - - /// Proposes a new admin (step 1 of two-step transfer). - /// The proposed address must call `accept_admin()` to complete the transfer. - /// - /// # Auth - /// - /// Requires authorization from the current admin. - pub fn transfer_admin(env: Env, new_admin: Address) { - admin::transfer_admin(&env, &new_admin); - } - - /// Accepts a pending admin transfer (step 2 of two-step transfer). - /// Emits `admin_transferred` and replaces the active admin. - /// - /// # Auth - /// - /// Requires authorization from the pending (new) admin. - pub fn accept_admin(env: Env) { - admin::accept_admin(&env); - } - - /// Returns the proposed admin address awaiting `accept_admin()`, or - /// `None` if there is no pending transfer. - pub fn get_pending_admin(env: Env) -> Option
{ - admin::get_pending_admin(&env) - } - - /// Returns whether the contract is currently paused. - pub fn is_contract_paused(env: Env) -> bool { - is_contract_paused(&env) - } - - /// Returns the current admin address, or `None` if no admin has been set. - pub fn get_admin(env: Env) -> Option
{ - storage::get_admin_optional(&env) - } - - /// Returns the default token address set during `initialize()`, or `None` if not initialized. - pub fn get_token(env: Env) -> Option
{ - storage::get_token(&env) - } - - pub fn propose_upgrade(env: Env, new_wasm_hash: BytesN<32>) { - upgrade::propose_upgrade(&env, new_wasm_hash); - } - - pub fn cancel_pending_upgrade(env: Env) { - upgrade::cancel_pending_upgrade(&env); - } - - pub fn commit_upgrade(env: Env) { - upgrade::commit_upgrade(&env); - } - - /// Returns the pending WASM hash queued for the two-step upgrade flow, - /// or `None` if no upgrade has been proposed. - /// - /// # Auth - /// - /// None required — view-only read. - /// - /// # Storage - /// - /// Reads `DataKey::PendingUpgrade` from temporary storage (TTL ~24 h). - /// Returns `None` when the key has expired or was never set. - pub fn get_pending_upgrade(env: Env) -> Option> { - upgrade::get_pending_upgrade(&env) - } - - pub fn clear_fee(env: Env) { - admin::require_admin(&env); - fee::clear_fee(&env); - events::publish_fee_cleared(&env); - } - - pub fn get_fee_collector(env: Env) -> Option
{ - fee::get_fee_collector(&env) - } - - /// Returns the cumulative protocol fees collected across all merchants, - /// accumulated from every `charge()` and `pay_per_use()` call. - pub fn get_total_protocol_fees(env: Env) -> i128 { - fee::get_total_protocol_fees(&env) - } - - pub fn get_subscription(env: Env, user: Address) -> Option { - env.storage().persistent().get(&DataKey::Subscription(user)) - } - - pub fn get_subscription_age(env: Env, user: Address) -> Option { - let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; - - if sub.created_at == 0 { - return None; // sentinel for migrated/unknown subscriptions - } - - Some(env.ledger().timestamp() - sub.created_at) - } - - /// Returns the Unix timestamp of the next scheduled charge for a user. - /// - /// Returns `None` if no subscription exists, the subscription is inactive, - /// or the subscription is paused. - pub fn next_charge_at(env: Env, user: Address) -> Option { - let sub = storage::get_subscription(&env, &user)?; - charge_exec::compute_next_charge_at(&sub) - } - - /// Returns `true` when `user` has a charge due right now. - /// - /// A charge is due when: - /// - The subscription is active and not paused - /// - `now >= next_charge_at` (interval has elapsed) - /// - `now <= next_charge_at + grace_period` (still within grace window, or no grace period set) - /// - /// No auth required. - pub fn is_charge_due(env: Env, user: Address) -> bool { - let sub = match storage::get_subscription(&env, &user) { - Some(s) => s, - None => return false, - }; - let next = match charge_exec::compute_next_charge_at(&sub) { - Some(n) => n, - None => return false, - }; - let now = env.ledger().timestamp(); - if now < next { - return false; - } - let grace = grace::get_grace_period(&env); - if grace > 0 && now > next + grace { - return false; - } - true - } - - /// Returns the trial end timestamp if the user is in a trial period. - pub fn get_trial_end(env: Env, user: Address) -> Option { - trial::get_trial_end(env, user) - } - - /// Proposes a new contract-wide grace period for charges. - /// Only the contract admin can call this. - pub fn propose_grace_period(env: Env, seconds: u64) { - bump_instance_ttl(&env); - grace::propose_grace_period(&env, seconds); - } - - /// Commits a pending contract-wide grace period proposal. - /// Only the contract admin can call this. - pub fn commit_grace_period(env: Env) { - bump_instance_ttl(&env); - grace::commit_grace_period(&env); - } - - /// Returns the current grace period in seconds. Returns 0 if not set. - pub fn get_grace_period(env: Env) -> u64 { - grace::get_grace_period(&env) - } - - /// Updates the recurring charge amount for `user`'s subscription. - /// - /// # Parameters - /// - /// - `user`: Subscriber whose subscription amount should be adjusted. - /// - `new_amount`: Replacement amount for future charges. Must be positive - /// and must not exceed `MAX_SUBSCRIPTION_AMOUNT`. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from the contract admin. - /// - /// # Errors - /// - /// Panics if the contract is paused, no subscription exists for `user`, - /// or `new_amount` fails amount validation. - /// - /// # Side Effects - /// - /// Overwrites the subscription's `amount` field in persistent storage, - /// refreshes its TTL, and emits `sub_amount_updated`. - pub fn set_subscription_amount(env: Env, user: Address, new_amount: i128) { - ensure_contract_not_paused(&env); - admin::require_admin(&env); - - validation::require_valid_amount(&env, new_amount); - - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - let old_amount = sub.amount; - sub.amount = new_amount; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(&env, &user); - - events::publish_subscription_amount_updated(&env, &user, old_amount, new_amount); - } - - /// Updates the billing interval for `user`'s subscription. - /// - /// # Parameters - /// - /// - `user`: Subscriber whose subscription interval should be adjusted. - /// - `new_interval`: Replacement interval in seconds. Must be strictly - /// greater than zero. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from the contract admin. - /// - /// # Errors - /// - /// Panics if the contract is paused, no subscription exists for `user`, - /// or `new_interval` is zero (`ContractError::IntervalTooShort`). - /// - /// # Side Effects - /// - /// Overwrites the subscription's `interval` field in persistent storage, - /// refreshes its TTL, and emits `sub_interval_updated`. The change takes - /// effect immediately: `next_charge_at` will return - /// `last_charged + new_interval` after this call. - pub fn set_subscription_interval(env: Env, user: Address, new_interval: u64) { - ensure_contract_not_paused(&env); - admin::require_admin(&env); - - let key = DataKey::Subscription(user.clone()); - - let mut sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - validation::require_valid_interval(&env, new_interval); - - let old_interval = sub.interval; - sub.interval = new_interval; - - env.storage().persistent().set(&key, &sub); - extend_subscription_ttl(&env, &user); - - events::publish_subscription_interval_updated(&env, &user, old_interval, new_interval); - } - - /// Sets the minimum allowed subscription interval in seconds. - /// Only the contract admin can call this. Panics if seconds == 0. - pub fn set_min_interval(env: Env, seconds: u64) { - if seconds == 0 { - env.panic_with_error(ContractError::IntervalMustBePositive); - } - admin::require_admin(&env); - min_interval::set_min_interval(&env, seconds); - } - - /// Returns the minimum allowed subscription interval in seconds. - /// Defaults to 3600 (1 hour) when unset. - pub fn get_min_interval(env: Env) -> u64 { - min_interval::get_min_interval(&env) - } - - /// Adds a merchant to the whitelist. - pub fn add_merchant(env: Env, merchant: Address) { - bump_instance_ttl(&env); - admin::require_admin(&env); - whitelist::add_merchant(&env, &merchant); - } - - /// Removes a merchant from the whitelist. - pub fn remove_merchant(env: Env, merchant: Address) { - bump_instance_ttl(&env); - admin::require_admin(&env); - whitelist::remove_merchant(&env, &merchant); - } - - /// Adds multiple merchants to the whitelist in a single call. - /// Admin-only. Duplicates are idempotent. - /// Returns the number of entries processed. - /// - /// Capped at the configurable whitelist batch limit - /// (`get_max_whitelist_batch_size`, default 50); panics with - /// `BatchTooLarge` above it. - pub fn whitelist_batch_add(env: Env, merchants: Vec
) -> u32 { - admin::require_admin(&env); - - whitelist::require_batch_within_limit(&env, merchants.len()); - - for merchant in merchants.iter() { - whitelist::add_merchant(&env, &merchant); - } - - merchants.len() - } - - /// Removes multiple merchants from the whitelist in a single call. - /// Admin-only. Removing a non-whitelisted merchant is a no-op. - /// Returns the number of entries processed. - /// - /// Capped at the configurable whitelist batch limit - /// (`get_max_whitelist_batch_size`, default 50); panics with - /// `BatchTooLarge` above it. - pub fn whitelist_batch_remove(env: Env, merchants: Vec
) -> u32 { - admin::require_admin(&env); - - whitelist::require_batch_within_limit(&env, merchants.len()); - - for merchant in merchants.iter() { - whitelist::remove_merchant(&env, &merchant); - } - - merchants.len() - } - - /// Enables or disables the merchant whitelist. - pub fn set_whitelist_enabled(env: Env, enabled: bool) { - bump_instance_ttl(&env); - admin::require_admin(&env); - whitelist::set_whitelist_enabled(&env, enabled); - } - - /// Returns whether the merchant whitelist is currently enabled. Defaults to true. - pub fn get_whitelist_enabled(env: Env) -> bool { - whitelist::get_whitelist_enabled(&env) - } - - /// Returns whether the merchant whitelist is currently enabled. - pub fn is_whitelist_enabled(env: Env) -> bool { - whitelist::is_whitelist_enabled(&env) - } - - /// Returns whether a merchant is whitelisted. - pub fn is_merchant_whitelisted(env: Env, merchant: Address) -> bool { - whitelist::is_whitelisted(&env, &merchant) - } - - /// Returns a paginated vector of whitelisted merchants. - pub fn get_whitelist_page(env: Env, offset: u32, limit: u32) -> Vec
{ - whitelist::get_whitelist_page(&env, offset, limit) - } - - /// Returns the total count of whitelisted merchants. - pub fn get_whitelist_size(env: Env) -> u32 { - whitelist::get_whitelist_size(&env) - } - - /// Returns the whitelist and freeze status for a batch of merchant addresses. - /// Capped at the configurable whitelist batch limit - /// (`get_max_whitelist_batch_size`, default 50) so the read path and the - /// admin write paths share one number. - pub fn get_merchant_statuses(env: Env, merchants: Vec
) -> Vec<(Address, bool, bool)> { - whitelist::require_batch_within_limit(&env, merchants.len()); - let mut result = Vec::new(&env); - for merchant in merchants.iter() { - let whitelisted = whitelist::is_whitelisted(&env, &merchant); - let frozen = whitelist::is_frozen(&env, &merchant); - result.push_back((merchant, whitelisted, frozen)); - } - result - } - - /// Returns top N merchants ranked by subscriber count in descending order. - /// `limit` is capped at 20; panics with `ContractError::BatchTooLarge` if exceeded. - pub fn get_top_merchants_by_subs(env: Env, limit: u32) -> Vec<(Address, u32)> { - merchant_stats::get_top_merchants_by_subs(&env, limit) - } - - /// Sets a custom fee recipient for a merchant. The caller must be the merchant. - /// The recipient cannot be the contract address and contract must not be paused. - pub fn set_merchant_fee_recipient(env: Env, merchant: Address, recipient: Address) { - ensure_contract_not_paused(&env); - fee::set_merchant_fee_recipient(&env, &merchant, &recipient); - } - - /// Returns the configured merchant fee recipient, or None when unset. - pub fn get_merchant_fee_recipient(env: Env, merchant: Address) -> Option
{ - fee::get_merchant_fee_recipient(&env, &merchant) - } - - /// Freezes a merchant, blocking new subscriptions while leaving existing - /// subscribers' charge and pay_per_use calls unaffected. Independent of - /// whitelist status — idempotent. - pub fn freeze_merchant(env: Env, merchant: Address, reason: Option) { - admin::require_admin(&env); - whitelist::freeze(&env, &merchant, reason); - } - - /// Unfreezes a merchant, allowing new subscriptions again. Idempotent. - pub fn unfreeze_merchant(env: Env, merchant: Address) { - admin::require_admin(&env); - whitelist::unfreeze(&env, &merchant); - } - - /// Returns the reason a merchant was frozen, if any. - pub fn get_merchant_freeze_reason(env: Env, merchant: Address) -> Option { - whitelist::get_freeze_reason(&env, &merchant) - } - - /// Extends the TTL of a specific merchant daily revenue bucket. - pub fn bump_merchant_revenue_day(env: Env, merchant: Address, day: u64) { - merchant_stats::bump_merchant_revenue_day(&env, &merchant, day); - } - - /// Prunes missing or expired daily revenue buckets safely. Admin only. - pub fn prune_merchant_revenue_days(env: Env, merchant: Address, days: Vec) { - merchant_stats::prune_merchant_revenue_days(&env, &merchant, days); - } - - /// Retrieves a specific daily revenue bucket. Returns 0 if missing. - pub fn get_merchant_revenue_day(env: Env, merchant: Address, day: u64) -> i128 { - merchant_stats::get_merchant_revenue_day(&env, &merchant, day) - } - - /// Returns paginated per-day revenue pairs for a merchant. - /// Limit is capped at 30. Returns an empty Vec if no history or out of bounds. - pub fn get_merchant_revenue_day_page( - env: Env, - merchant: Address, - offset: u32, - limit: u32, - ) -> Vec<(u64, i128)> { - merchant_stats::get_merchant_revenue_day_page(&env, &merchant, offset, limit) - } - - /// Returns whether a merchant is currently frozen. - pub fn is_merchant_frozen(env: Env, merchant: Address) -> bool { - whitelist::is_frozen(&env, &merchant) - } - - /// Returns the current protocol fee settings, or `None` if unset. - pub fn get_fee(env: Env) -> Option<(Address, u32)> { - fee::get_fee_collector(&env).map(|collector| (collector, fee::get_fee_bps(&env))) - } - - /// Proposes new protocol fee collection settings (step 1 of two-step commit). - /// Stores the proposed `(collector, bps)` in temporary storage and emits - /// `fee_proposed`. Must be followed by `commit_fee()` to take effect. - /// - /// # Auth - /// - /// Requires authorization from the current admin. - /// - /// # Errors - /// - /// Panics if `bps > 10000` (`InvalidFeeBps`) or if `collector` is the - /// contract's own address (`InvalidFeeCollector`). - pub fn propose_fee(env: Env, collector: Address, bps: u32) { - bump_instance_ttl(&env); - admin::require_admin(&env); - fee::propose_fee(&env, collector, bps); - } - - /// Commits a pending fee proposal (step 2 of two-step commit). - /// Reads the pending `(collector, bps)` from temporary storage, applies it - /// to instance storage, removes the pending entry, and emits `fee_committed`. - /// - /// # Auth - /// - /// Requires authorization from the current admin. - /// - /// # Errors - /// - /// Panics with `NoPendingProposal` if no pending fee exists. - pub fn commit_fee(env: Env) { - bump_instance_ttl(&env); - admin::require_admin(&env); - fee::commit_fee(&env); - } - - // ───────────────────────────────────────────────────────────── - // Batch charge - // ───────────────────────────────────────────────────────────── - - /// Charges multiple subscribers in a single transaction. - /// - /// Each user is processed independently — individual failures (inactive, - /// paused, interval not elapsed, etc.) are recorded as a `ChargeResult` - /// variant and do **not** abort the batch. - pub fn batch_charge(env: Env, users: Vec
) -> Vec { - bump_instance_ttl(&env); - migration::require_current_version(&env); - ensure_contract_not_paused(&env); - batch::batch_charge(&env, users) - } - - // ───────────────────────────────────────────────────────────── - // Subscription count - // ───────────────────────────────────────────────────────────── - - /// Returns the current number of active subscriptions. - pub fn get_active_count(env: Env) -> u64 { - subscription_count::get_active_count(&env) - } - - // ───────────────────────────────────────────────────────────── - // Subscriber index - // ───────────────────────────────────────────────────────────── - - /// Returns the total number of unique subscribers ever recorded (append-only count). - pub fn get_subscriber_count(env: Env) -> u64 { - subscription_count::get_subscriber_index_size(&env) - } - - /// Returns the subscriber address at the given index slot, or `None` if - /// out of range or the slot has been pruned (cancelled subscriber). - pub fn get_subscriber_at(env: Env, index: u64) -> Option
{ - if subscription_count::is_subscriber_index_removed(&env, index) { - return None; - } - env.storage() - .persistent() - .get(&DataKey::SubscriberIndex(index)) - } - - /// Returns a page of subscriber addresses starting at `offset`, capped at 50 per call. - /// Pruned (cancelled) slots are skipped. Returns an empty Vec when - /// `offset >= count` or `limit == 0`. - pub fn get_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ - let count = subscription_count::get_subscriber_index_size(&env); - let cap: u32 = if limit > 50 { 50 } else { limit }; - let mut result = Vec::new(&env); - if offset >= count || cap == 0 { - return result; - } - let mut i = offset; - let end = offset + cap as u64; - while i < end && i < count { - if !subscription_count::is_subscriber_index_removed(&env, i) { - if let Some(addr) = env.storage().persistent().get(&DataKey::SubscriberIndex(i)) { - result.push_back(addr); - } - } - i += 1; - } - result - } - - /// Returns a list of subscriber addresses that are currently due for charging. - /// Reads from the `SubscriberIndex` starting from `offset` up to `offset + limit`. - /// Capped at 50 per call. Optionally filters out grace-lapsed subscriptions when - /// `exclude_lapsed` is `Some(true)` or `None`. - pub fn get_next_charge_batch( - env: Env, - offset: u64, - limit: u32, - exclude_lapsed: Option, - ) -> Vec
{ - if limit > 50 { - env.panic_with_error(ContractError::BatchTooLarge); - } - let size = subscription_count::get_subscriber_index_size(&env); - let mut result = Vec::new(&env); - if offset >= size || limit == 0 { - return result; - } - let exclude = exclude_lapsed.unwrap_or(true); - let mut i = offset; - let end = (offset + limit as u64).min(size); - while i < end { - if !subscription_count::is_subscriber_index_removed(&env, i) { - if let Some(addr) = env.storage().persistent().get::(&DataKey::SubscriberIndex(i)) { - if let Some(sub) = storage::get_subscription(&env, &addr) { - if let Some(next) = charge_exec::compute_next_charge_at(&sub) { - let now = env.ledger().timestamp(); - if now >= next { - let grace = grace::get_grace_period(&env); - let lapsed = grace > 0 && now > next + grace; - if !exclude || !lapsed { - result.push_back(addr); - } - } - } - } - } - } - i += 1; - } - result - } - - /// Extends the TTL of all subscriber index entries to prevent archival. - /// - /// Iterates `SubscriberIndex(0..size)` and calls `extend_ttl` on each, - /// along with `SubscriberIndexSize`, `SubscriberIndexSlot`, and - /// `SubscriberIndexRemoved` entries. Bumps TTL to `SUBSCRIPTION_TTL_LEDGERS`. - /// - /// # Auth - /// - /// Requires authorization from the contract admin. - /// - /// # Side Effects - /// - /// Extends the TTL of every persistent subscriber index entry and emits - /// a `subscriber_index_ttl_extended` event with the total count. - pub fn extend_subscriber_index_ttl(env: Env) { - admin::require_admin(&env); - - let size = subscription_count::get_subscriber_index_size(&env); - - if size == 0 { - return; - } - - // Extend the size counter itself - env.storage().persistent().extend_ttl( - &DataKey::SubscriberIndexSize, - SUBSCRIPTION_TTL_LEDGERS, - SUBSCRIPTION_TTL_LEDGERS, - ); - - let mut count: u64 = 0; - let mut i: u64 = 0; - while i < size { - let key = DataKey::SubscriberIndex(i); - env.storage().persistent().extend_ttl( - &key, - SUBSCRIPTION_TTL_LEDGERS, - SUBSCRIPTION_TTL_LEDGERS, - ); - count += 1; - i += 1; - } - - events::publish_subscriber_index_ttl_extended(&env, count); - } - - /// Admin-only repair: tombstones a single stale subscriber index slot. - /// - /// Looks up the occupant of `index`, refuses if that subscriber currently - /// has an active subscription, then marks the slot removed so keepers skip - /// it. This does **not** garbage-collect the rest of the index. - /// - /// # Auth - /// - /// Requires authorization from the contract admin. - /// - /// # Errors - /// - /// Panics with `NoSubscriptionFound` if `index` is out of range, empty, or - /// already tombstoned. Panics with `CannotClearActiveSubscriber` if the - /// occupant still has an active subscription. - /// - /// # Side Effects - /// - /// Writes `SubscriberIndexRemoved(index)`, drops the reverse slot lookup - /// when it points at this index, and emits `subscriber_index_cleared`. - pub fn clear_subscriber_index_entry(env: Env, index: u64) { - admin::require_admin(&env); - let user = subscription_count::clear_subscriber_index_entry(&env, index); - events::publish_subscriber_index_cleared(&env, &user, index); - } - - // ───────────────────────────────────────────────────────────── - // Merchant revenue - // ───────────────────────────────────────────────────────────── - - /// Returns the total amount charged to a merchant's subscribers - /// (sum of all successful `charge()` and `pay_per_use()` calls). - pub fn get_merchant_revenue(env: Env, merchant: Address) -> i128 { - merchant_stats::get_merchant_revenue(&env, &merchant) - } - - /// Returns per-charge revenue entries for the merchant (up to `days` most recent). - /// Oldest -> newest. Returns an empty Vec when no history has been recorded or after clearing. - pub fn get_merchant_revenue_history(env: Env, merchant: Address, days: u32) -> Vec { - merchant_stats::get_merchant_revenue_history(&env, &merchant, days) - } - - /// Returns aggregate revenue statistics for a merchant: (total, count, min_charge, max_charge). - pub fn get_merchant_revenue_summary(env: Env, merchant: Address) -> (i128, i128, i128, i128) { - merchant_stats::get_merchant_revenue_summary(&env, &merchant) - } - - /// Returns a composite health report for a user's subscription. - pub fn get_subscription_health(env: Env, user: Address) -> SubscriptionHealth { - let sub = match storage::get_subscription(&env, &user) { - Some(s) => s, - None => { - return SubscriptionHealth { - active: false, - charge_due: false, - within_grace: false, - has_sufficient_allowance: false, - is_paused: false, - trial_active: false, - daily_limit_set: false, - } - } - }; - - let active = sub.active; - let is_paused = sub.paused; - let charge_due = Self::is_charge_due(env.clone(), user.clone()); - - let next_charge = charge_exec::compute_next_charge_at(&sub); - let now = env.ledger().timestamp(); - let grace = grace::get_grace_period(&env); - - let within_grace = if let Some(next) = next_charge { - now >= next && grace > 0 && now <= next + grace - } else { - false - }; - - let has_sufficient_allowance = - validation::has_sufficient_allowance(&env, &user, &sub.token, sub.amount); - - let trial_active = trial::get_trial_end(env.clone(), user.clone()).is_some(); - let daily_limit_set = spending_limit::get_daily_limit(&env, &user).is_some(); - - SubscriptionHealth { - active, - charge_due, - within_grace, - has_sufficient_allowance, - is_paused, - trial_active, - daily_limit_set, - } - } - - /// Clears the merchant's revenue history Vec from persistent storage. - /// Only the contract admin can call this. Idempotent — safe to call when no history exists. - /// Does not affect the cumulative revenue total. - pub fn clear_merchant_revenue_history(env: Env, merchant: Address) { - admin::require_admin(&env); - merchant_stats::clear_revenue_history(&env, &merchant); - events::publish_merchant_history_cleared(&env, &merchant); - } - - /// Returns the number of active subscribers for a given merchant. - pub fn get_merchant_subscriber_count(env: Env, merchant: Address) -> u64 { - merchant_stats::get_merchant_subscriber_count(&env, &merchant) - } - - /// Returns the number of active subscribers for a given merchant (as u32). - pub fn get_merchant_sub_count(env: Env, merchant: Address) -> u32 { - subscription_count::get_merchant_sub_count(&env, &merchant) - } - - /// Returns active subscriber counts for multiple merchants in a single call. - /// Capped at 50 merchants; panics with `BatchTooLarge` above that. - /// Returns `(addr, 0)` for merchants with no recorded count. - /// No auth required. - pub fn get_merchant_sub_counts(env: Env, merchants: Vec
) -> Vec<(Address, u32)> { - merchant_stats::get_merchant_sub_counts(&env, &merchants) - } - - /// Resets a merchant's cumulative revenue counter to zero. - /// Only the contract admin can call this. - pub fn reset_merchant_revenue(env: Env, merchant: Address) { - admin::require_admin(&env); - merchant_stats::reset_merchant_revenue(&env, &merchant); - } - - /// Withdraws the merchant's accrued revenue from the contract balance - /// to their address. - /// - /// # Parameters - /// - /// - `merchant`: The merchant address. Must authorize the call. - /// - /// # Returns - /// - /// Returns nothing. - /// - /// # Auth - /// - /// Requires authorization from `merchant`. - /// - /// # Errors - /// - /// Panics if the contract is paused, the global token is not configured, - /// or the tracked accrued balance is zero or negative - /// (`ContractError::ZeroBalanceAvailable`). - /// - /// # Side Effects - /// - /// Resets the `MerchantRevenue` counter to zero before transferring - /// (reentrancy safety), then transfers tokens from the contract account - /// to `merchant` and emits `merchant_withdrawal`. - pub fn withdraw_merchant_revenue(env: Env, merchant: Address) { - ensure_contract_not_paused(&env); - merchant.require_auth(); - - let token_addr = storage::get_token(&env) - .unwrap_or_else(|| env.panic_with_error(ContractError::NotInitialized)); - - let amount = merchant_stats::get_merchant_revenue(&env, &merchant); - if amount <= 0 { - env.panic_with_error(ContractError::ZeroBalanceAvailable); - } - - // Reset before transfer to guard against reentrancy. - merchant_stats::reset_merchant_revenue(&env, &merchant); - - let token_client = token::Client::new(&env, &token_addr); - token_client.transfer(&env.current_contract_address(), &merchant, &amount); - - events::publish_merchant_withdrawal(&env, &merchant, amount); - } - - // ───────────────────────────────────────────────────────────── - // Daily spending limits - // ───────────────────────────────────────────────────────────── - - /// Sets a daily spending cap for `pay_per_use()` for the calling user. - /// Stored in temporary storage; resets automatically after ~1 day. - pub fn set_daily_limit(env: Env, user: Address, limit: i128) { - user.require_auth(); - if limit <= 0 { - env.panic_with_error(ContractError::AmountMustBePositive); - } - spending_limit::set_daily_limit(&env, &user, limit); - events::publish_daily_limit_set(&env, &user, limit); - } - - /// Returns the daily spending limit for a user, or `None` if not set. - /// Removes the caller's daily spending cap for `pay_per_use()`. - pub fn remove_daily_limit(env: Env, user: Address) { - user.require_auth(); - spending_limit::remove_daily_limit(&env, &user); - events::publish_daily_limit_removed(&env, &user); - } - - /// Returns the current daily spending limit for the caller, or `None` if unset. - pub fn get_daily_limit(env: Env, user: Address) -> Option { - spending_limit::get_daily_limit(&env, &user) - } - - // ───────────────────────────────────────────────────────────── - /// Returns the amount spent so far today via `pay_per_use()` for the caller. - pub fn get_daily_spent(env: Env, user: Address) -> i128 { - spending_limit::get_daily_spent(&env, &user) - } - - /// Returns a consistent snapshot of a user's daily spending window. - /// `remaining` is `None` when no limit is configured and is clamped to - /// zero when spending has reached or exceeded the configured limit. - pub fn get_daily_limit_status(env: Env, user: Address) -> DailyLimitStatus { - spending_limit::get_daily_limit_status(&env, &user) - } - - // ───────────────────────────────────────────── - // Referral tracking - // ───────────────────────────────────────────────────────────── - - /// Returns the referrer address for a given subscriber, or `None`. - pub fn get_referral(env: Env, user: Address) -> Option
{ - referral::get_referrer(&env, &user) - } - - /// Returns the referrer address for a given subscriber, or `None`. - pub fn get_referrer(env: Env, user: Address) -> Option
{ - referral::get_referrer(&env, &user) - } - - // ───────────────────────────────────────────────────────────── - // State migration - // ───────────────────────────────────────────────────────────── - - /// Migrates contract storage to the latest schema version. - /// Safe to call multiple times — subsequent calls are no-ops. - pub fn migrate(env: Env, users: Vec
) { - migration::migrate(&env, users); - } - - /// Returns the current storage schema version. - pub fn get_schema_version(env: Env) -> u32 { - migration::get_schema_version(&env) - } - - /// Returns the schema version required before current-schema subscription - /// writes and charges are enabled. Migration is admin-driven and paginated. - pub fn require_current_schema(env: Env) { - migration::require_current_version(&env); - } - - // ───────────────────────────────────────────────────────────── - // Subscription metadata - // ───────────────────────────────────────────────────────────── - - /// Attaches a short label (e.g. plan name) to the caller's subscription. - pub fn set_metadata(env: Env, user: Address, label: String) { - user.require_auth(); - if let Err(err) = subscription_metadata::set_metadata(&env, &user, label) { - env.panic_with_error(err); - } - } - - /// Returns the metadata label for a subscriber, or `None` if not set. - pub fn get_metadata(env: Env, user: Address) -> Option { - subscription_metadata::get_metadata(&env, &user) - } - - /// Alias for `get_metadata` — returns the metadata label for a subscriber, or `None` if not set. - pub fn get_subscription_label(env: Env, user: Address) -> Option { - subscription_metadata::get_metadata(&env, &user) - } - - /// Clears the metadata label for the caller's subscription. - pub fn clear_metadata(env: Env, user: Address) { - user.require_auth(); - subscription_metadata::clear_metadata(&env, &user); - } - - // ───────────────────────────────────────────────────────────── - // Charge history - // ───────────────────────────────────────────────────────────── - - /// Returns the last (up to 12) charge timestamps for a subscriber, - /// ordered oldest → newest. - pub fn get_charge_history(env: Env, user: Address) -> Vec { - subscription_history::get_charge_history(&env, &user) - } - - /// Returns the count of stored charge timestamps for a subscriber. - pub fn get_charge_history_count(env: Env, user: Address) -> u32 { - subscription_history::get_charge_history_count(&env, &user) - } - - // ───────────────────────────────────────────────────────────── - // Protocol stats - // ───────────────────────────────────────────────────────────── - - /// Returns a snapshot of all protocol-level state in a single call. - pub fn get_protocol_stats(env: Env) -> ProtocolStats { - ProtocolStats { - active_count: subscription_count::get_active_count(&env), - fee_bps: fee::get_fee_bps(&env), - fee_collector: fee::get_fee_collector(&env), - grace_period: grace::get_grace_period(&env), - whitelist_enabled: whitelist::is_whitelist_enabled(&env), - schema_version: migration::get_schema_version(&env), - contract_paused: env - .storage() - .instance() - .get(&DataKey::ContractPaused) - .unwrap_or(false), - } - } - - // ───────────────────────────────────────────────────────────── - // Contract pause - // ───────────────────────────────────────────────────────────── - - /// Pauses the contract. Only the admin can call this. - pub fn pause_contract(env: Env) { - admin::require_admin(&env); - storage::set_contract_paused(&env, true); - events::publish_contract_paused(&env); - } - - /// Unpauses the contract. Only the admin can call this. - pub fn unpause_contract(env: Env) { - admin::require_admin(&env); - storage::set_contract_paused(&env, false); - events::publish_contract_unpaused(&env); - } - - // Admin setup - // ───────────────────────────────────────────────────────────── - - /// Bootstrap-only entrypoint that writes the contract admin when no admin - /// is configured. This is a narrower alternative to [`Self::initialize`]: - /// - /// - **`initialize(token, admin)`** atomically sets the default token *and* - /// the admin together. Use this for standard deployments via - /// `scripts/deploy-pipeline.ts` — it is the canonical full-init path. - /// - **`set_initial_admin(admin)`** sets only the admin slot. It is - /// intended for partial-recovery or segmented-deploy scenarios where the - /// token is written separately (or not at all), and admin-only governance - /// is needed before full initialization. - /// - /// In both cases the proposed admin must sign the call via - /// `require_auth()`, and a second call on an already-configured contract - /// fails with a typed `ContractError::AdminAlreadySet` (code 42) so - /// deploy scripts can detect the condition without string-parsing panics. - pub fn set_initial_admin(env: Env, admin: Address) { - admin.require_auth(); - if env.storage().instance().has(&DataKey::Admin) { - env.panic_with_error(ContractError::AlreadyInitialized); - env.panic_with_error(ContractError::AdminAlreadySet); - } - storage::set_admin(&env, &admin); - } - - // ───────────────────────────────────────────────────────────── - // Health check - // ───────────────────────────────────────────────────────────── - - /// Returns a snapshot of contract health. Safe to call at any time — no auth required, no storage writes. - pub fn contract_health_check(env: Env) -> HealthReport { - let contract_paused = storage::is_contract_paused(&env); - let token_configured = storage::get_token(&env).is_some(); - let admin_configured = storage::get_admin_optional(&env).is_some(); - let fee_collector_set = fee::get_fee_collector(&env).is_some(); - - #[cfg(any(test, feature = "testutils"))] - let instance_ttl_ledgers = { - use soroban_sdk::testutils::storage::Instance as _; - env.storage().instance().get_ttl() - }; - #[cfg(not(any(test, feature = "testutils")))] - let instance_ttl_ledgers = 100_000; // at least 1 day of TTL remaining, used as default since get_ttl is not available on-chain - - let active_subscription_count = subscription_count::get_active_count(&env); - let schema_version = migration::get_schema_version(&env); - - let window: Option = - env.storage().instance().get(&DataKey::GlobalVolumeWindow); - let accumulated_volume = window.map(|w| w.accumulated_volume).unwrap_or(0); - let cap = env - .storage() - .instance() - .get(&DataKey::GlobalVolumeCapOverride) - .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR); - - let pct = if cap > 0 { - ((accumulated_volume * 100) / cap) as u32 - } else { - 0 - }; - let global_volume_utilization_pct = if pct > 100 { 100 } else { pct }; - - let total_merchants = merchant_stats::get_merchant_index_size(&env); - let mut pending_merchant_rev_count = 0; - for i in 0..total_merchants { - if let Some(merchant) = env.storage().persistent().get(&DataKey::MerchantIndex(i)) { - if merchant_stats::get_merchant_revenue(&env, &merchant) > 0 { - pending_merchant_rev_count += 1; - } - } - } - - // Healthy when not paused, fully configured, and at least 1 day of TTL remaining (17_280 ledgers at ~5 s/ledger) - let is_healthy = !contract_paused - && token_configured - && admin_configured - && instance_ttl_ledgers > 17_280; - - HealthReport { - is_healthy, - contract_paused, - token_configured, - admin_configured, - instance_ttl_ledgers, - active_subscription_count, - schema_version, - fee_collector_set, - global_volume_utilization_pct, - pending_merchant_rev_count, - } - } - - /// Clears the charge history for a subscriber. - /// Only the contract admin can call this. - pub fn clear_charge_history(env: Env, user: Address) { - admin::require_admin(&env); - subscription_history::clear_charge_history(&env, &user); - } - - /// Admin-only: removes the ChargeHistory entry for `user` entirely. - pub fn prune_charge_history(env: Env, user: Address) { - admin::require_admin(&env); - subscription_history::prune_charge_history(&env, &user); - } - - /// Returns the current TTL (in ledgers) of the ChargeHistory entry, or 0 if absent. - pub fn get_charge_history_ttl(env: Env, user: Address) -> u32 { - subscription_history::get_charge_history_ttl(&env, &user) - } - - /// Returns a paginated slice of charge timestamps for a subscriber. - /// limit is capped at 12. If `ascending` is false, records are returned in descending order (newest first). - pub fn get_charge_history_page( - env: Env, - user: Address, - offset: u32, - limit: u32, - ascending: bool, - ) -> Vec { - subscription_history::get_charge_history_page(&env, &user, offset, limit, ascending) - } - - /// Transfers subscription ownership from `user` to `new_user`. - /// - /// # Auth - /// - /// Requires authorization from `user`. - /// - /// # Errors - /// - /// Panics if the contract is paused, no active subscription exists for - /// `user`, or `new_user` already holds an active subscription. - /// - /// # Side Effects - /// - /// Moves the subscription struct to `new_user`, removes it from `user`, - /// refreshes TTL, and emits `sub_transferred` and `subscription_transferred`. - pub fn transfer_subscription(env: Env, user: Address, new_user: Address) { - ensure_contract_not_paused(&env); - validation::require_valid_transfer_targets(&env, &user, &new_user); - user.require_auth(); - new_user.require_auth(); - - let old_key = DataKey::Subscription(user.clone()); - let new_key = DataKey::Subscription(new_user.clone()); - - let sub: Subscription = env - .storage() - .persistent() - .get(&old_key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - if !sub.active { - env.panic_with_error(ContractError::NoSubscriptionFound); - } - - if let Some(existing) = env - .storage() - .persistent() - .get::(&new_key) - { - if existing.active { - env.panic_with_error(ContractError::SubscriptionAlreadyActive); - } - } - - env.storage().persistent().set(&new_key, &sub); - env.storage().persistent().remove(&old_key); - - subscription_count::transfer_subscriber_index(&env, &user, &new_user); - extend_subscription_ttl(&env, &new_user); - - events::publish_subscription_transferred(&env, &user, &new_user); - events::emit_subscription_transferred(&env, &user, &new_user, &sub); - } - - // ───────────────────────────────────────────────────────────── - // Configurable global hourly volume cap - // ───────────────────────────────────────────────────────────── - - /// Returns the currently effective global hourly volume cap (stroops). - /// Falls back to the compile-time `GLOBAL_MAX_VOLUME_PER_HOUR` default - /// when no operator override has been configured. - pub fn get_global_volume_cap(env: Env) -> i128 { - env.storage() - .instance() - .get(&DataKey::GlobalVolumeCapOverride) - .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR) - } - - /// Returns the current global volume window as `(accumulated_volume, window_start_timestamp)`. - /// Returns `(0, 0)` if no window has been started yet. - /// No auth required. - pub fn get_global_volume_window(env: Env) -> (i128, u64) { - let window: Option = - env.storage().instance().get(&DataKey::GlobalVolumeWindow); - match window { - Some(w) => (w.accumulated_volume, w.current_window_start), - None => (0, 0), - } - } - - /// Admin-only: overrides the global hourly volume cap without requiring - /// a contract upgrade. `new_cap` must be strictly positive. - pub fn set_global_volume_cap(env: Env, new_cap: i128) { - admin::require_admin(&env); - if new_cap <= 0 { - env.panic_with_error(ContractError::InvalidVolumeCap); - } - env.storage() - .instance() - .set(&DataKey::GlobalVolumeCapOverride, &new_cap); - } - - // ───────────────────────────────────────────────────────────── - // Configurable fee bounds (governance guardrails) - // ───────────────────────────────────────────────────────────── - - /// Admin-only: configures the allowed [min_bps, max_bps] range for - /// future fee proposals, guarding against accidental fee misconfiguration - /// (e.g. an operator typo setting bps close to 10000). - pub fn set_fee_bounds(env: Env, min_bps: u32, max_bps: u32) { - admin::require_admin(&env); - if min_bps > max_bps || max_bps > 10_000 { - env.panic_with_error(ContractError::InvalidFeeBounds); - } - env.storage().instance().set(&DataKey::MinFeeBps, &min_bps); - env.storage().instance().set(&DataKey::MaxFeeBps, &max_bps); - } - - /// Returns the configured (min_bps, max_bps) fee bounds, defaulting to - /// (0, 10000) when governance has not configured explicit bounds. - pub fn get_fee_bounds(env: Env) -> (u32, u32) { - let min_bps = env - .storage() - .instance() - .get(&DataKey::MinFeeBps) - .unwrap_or(0u32); - let max_bps = env - .storage() - .instance() - .get(&DataKey::MaxFeeBps) - .unwrap_or(10_000u32); - (min_bps, max_bps) - } - - // ───────────────────────────────────────────────────────────── - // Lightweight subscription reads - // ───────────────────────────────────────────────────────────── - - /// Returns the token address for a user's subscription without decoding - /// the full `Subscription` struct. - /// - /// Returns `Some(token)` when any subscription record exists for `user` - /// (including inactive/cancelled ones), and `None` when the user has never - /// subscribed. - /// - /// No auth required (view-only). - pub fn get_subscription_token(env: Env, user: Address) -> Option
{ - let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; - Some(sub.token) - } - - /// Returns just the merchant address for a user's subscription, without - /// decoding the full `Subscription` struct. Lighter-weight than - /// `get_subscription` for callers that only need to know which merchant - /// a user subscribes to. - pub fn get_subscriber_merchant(env: Env, user: Address) -> Option
{ - let sub: Subscription = env - .storage() - .persistent() - .get(&DataKey::Subscription(user))?; - Some(sub.merchant) - } - - /// Returns a page of subscriber addresses starting at `offset`, capped - /// at 50 per call, filtered to only those whose subscription is - /// currently active. Avoids forcing callers to over-fetch via - /// `get_subscriber_page` and filter client-side. - pub fn get_active_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ - let count = subscription_count::get_subscriber_index_size(&env); - let cap: u32 = if limit > 50 { 50 } else { limit }; - let mut result = Vec::new(&env); - if offset >= count || cap == 0 { - return result; - } - let mut i = offset; - while i < count && result.len() < cap { - if let Some(addr) = env - .storage() - .persistent() - .get::(&DataKey::SubscriberIndex(i)) - { - if let Some(sub) = env - .storage() - .persistent() - .get::(&DataKey::Subscription(addr.clone())) - { - if sub.active { - result.push_back(addr); - } - } - } - i += 1; - } - result - } -} - -#[contractimpl] -#[cfg(test)] -impl FlowPay { - /// Upgrades the current contract WASM to `new_wasm_hash` (test only). - pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { - upgrade::upgrade(&env, new_wasm_hash); - } -} - -/// Refreshes the contract instance's TTL. Instance storage holds shared -/// protocol state (Admin, Token, FeeCollector, FeeBps, GracePeriod, -/// WhitelistEnabled, SchemaVersion, ActiveCount, ...) which all share one -/// TTL — if it lapses from prolonged inactivity, the contract is bricked. -/// Called at the start of every state-mutating public function so any -/// active use continuously keeps the instance alive without a keeper. -fn bump_instance_ttl(env: &Env) { - env.storage() - .instance() - .extend_ttl(SUBSCRIPTION_TTL_LEDGERS / 2, SUBSCRIPTION_TTL_LEDGERS); -} - -fn extend_subscription_ttl(env: &Env, user: &Address) { - storage::extend_subscription_ttl(env, user); - env.storage() - .instance() - .extend_ttl(SUBSCRIPTION_TTL_LEDGERS, SUBSCRIPTION_TTL_LEDGERS); -} - -/// Shared implementation for `pay_per_use` and `pay_per_use_to`. `recipient` -/// is `None` for `pay_per_use` (defaults to `sub.merchant`, matching its -/// existing behavior exactly) and `Some(addr)` for `pay_per_use_to`. -fn pay_per_use_inner(env: &Env, user: Address, amount: i128, recipient: Option
) { - ensure_contract_not_paused(env); - user.require_auth(); - - if amount <= 0 { - env.panic_with_error(ContractError::AmountMustBePositive); - } - if amount > MAX_AMOUNT { - env.panic_with_error(ContractError::AmountExceedsMaximum); - } - - let key = DataKey::Subscription(user.clone()); - - let sub: Subscription = env - .storage() - .persistent() - .get(&key) - .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); - - if sub.paused { - env.panic_with_error(ContractError::SubscriptionPaused); - } - if !sub.active { - env.panic_with_error(ContractError::SubscriptionInactive); - } - - // Only the explicit `pay_per_use_to` path re-validates the whitelist; - // `pay_per_use` (recipient == None) keeps its existing behavior of not - // re-checking a merchant that was already whitelisted at subscribe time. - let is_pay_per_use_to = recipient.is_some(); - let recipient = recipient.unwrap_or_else(|| sub.merchant.clone()); - - if is_pay_per_use_to { - if recipient == env.current_contract_address() { - env.panic_with_error(ContractError::InvalidRecipient); - } - if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &recipient) { - env.panic_with_error(ContractError::MerchantNotWhitelisted); - } - } - - spending_limit::enforce_limit(env, &user, amount); - - let fee_amount = fee::transfer_pay_per_use(env, &user, &sub.token, amount, &recipient); - let net_amount = amount - fee_amount; - - check_and_update_global_volume(env, amount); - merchant_stats::increment_revenue_with_daily(env, &recipient, net_amount); - spending_limit::record_spend(env, &user, amount); - extend_subscription_ttl(env, &user); - - events::publish_pay_per_use(env, &user, &recipient, amount); -} - -fn subscribe_inner( - env: &Env, - user: Address, - merchant: Address, - amount: i128, - interval: u64, - token: Address, - trial_period: Option, - referrer: Option
, -) { - bump_instance_ttl(env); - // Invariant: refuse new subscription writes when the storage schema has not - // been fully migrated to the current version. After a WASM upgrade, the - // operator must call `migrate` (paged) for all existing subscribers before - // new blobs can be written, preventing mixed v1/v2/v3 storage states. - migration::require_current_version(env); - migration::require_current_version(env); - validation::require_valid_subscribe_addresses(env, &user, &merchant); - user.require_auth(); - - if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &merchant) { - env.panic_with_error(ContractError::MerchantNotWhitelisted); - } - - if whitelist::is_frozen(env, &merchant) { - env.panic_with_error(ContractError::MerchantFrozen); - } - - // Prevent new subscriptions when contract is paused - let paused = env - .storage() - .instance() - .get::<_, bool>(&DataKey::ContractPaused) - .unwrap_or(false); - if paused { - env.panic_with_error(ContractError::ContractPaused); - } - - validation::require_valid_amount(env, amount); - validation::validate_interval(env, interval); - - use soroban_sdk::xdr::ToXdr; - if token.clone().to_xdr(env).get(7) == Some(0) { - env.panic_with_error(ContractError::InvalidTokenAddress); - } - - validation::check_allowance(env, &user, &token, amount); - - let now = env.ledger().timestamp(); - let trial_duration = trial_period.unwrap_or(0); - let last_charged = now + trial_duration; - - let existing = storage::get_subscription(env, &user); - let should_increment = existing.as_ref().is_none_or(|s| !s.active); - - if let Some(ref existing_sub) = existing { - if existing_sub.active && existing_sub.merchant != merchant { - merchant_stats::decrement_subscriber_count(env, &existing_sub.merchant); - } - } - - let sub = Subscription { - merchant, - amount, - interval, - last_charged, - active: true, - paused: false, - token, - referrer: referrer.clone(), - label: Symbol::new(env, ""), - trial_duration, - created_at: env.ledger().timestamp(), - }; - - env.storage() - .persistent() - .set(&DataKey::Subscription(user.clone()), &sub); - - extend_subscription_ttl(env, &user); - - if should_increment { - subscription_count::increment(env); - subscription_count::append_subscriber_index(env, &user); - } - referral::store_referral(env, &user, &referrer); - merchant_stats::increment_subscriber_count(env, &sub.merchant); - events::publish_subscribed(env, &user, &sub); -} - -pub(crate) fn check_and_update_global_volume(env: &Env, amount: i128) { - let now = env.ledger().timestamp(); - let mut window: GlobalVolumeWindow = env - .storage() - .instance() - .get(&DataKey::GlobalVolumeWindow) - .unwrap_or(GlobalVolumeWindow { - current_window_start: now, - accumulated_volume: 0, - }); - - // Checked: a window start near u64::MAX must not wrap the rollover test - // into an accidental (or permanently suppressed) window reset. - let window_end = window - .current_window_start - .checked_add(HOUR_IN_SECONDS) - .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); - - if now >= window_end { - window.current_window_start = now; - window.accumulated_volume = 0; - } - - // Overflow and cap breach are distinct failure modes: an accumulator that - // cannot represent the sum is a typed `ArithmeticOverflow`, not a policy - // rejection, so clients can tell "the protocol is at its hourly cap" from - // "this amount is not representable". - let new_volume = window - .accumulated_volume - .checked_add(amount) - .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); - - if new_volume > GLOBAL_MAX_VOLUME_PER_HOUR { - env.panic_with_error(ContractError::GlobalVolumeExceeded); - } - - window.accumulated_volume = new_volume; - env.storage() - .instance() - .set(&DataKey::GlobalVolumeWindow, &window); -} - -fn is_contract_paused(env: &Env) -> bool { - env.storage() - .instance() - .get(&DataKey::ContractPaused) - .unwrap_or(false) -} - -fn ensure_contract_not_paused(env: &Env) { - if is_contract_paused(env) { - env.panic_with_error(ContractError::ContractPaused); - } -} - +#![no_std] +#![allow(clippy::too_many_arguments, clippy::inconsistent_digit_grouping)] + +#[cfg(test)] +extern crate std; + +mod admin; +mod batch; +#[cfg(feature = "bench")] +mod bench; +mod charge_exec; +mod errors; +mod events; +mod fee; +mod grace; +mod merchant_stats; +mod migration; +mod min_interval; +mod referral; +mod spending_limit; +mod storage; +mod subscription_count; +mod subscription_history; +mod subscription_metadata; +mod test; +mod trial; +mod upgrade; +mod validation; +mod whitelist; + +use crate::errors::ContractError; +use soroban_sdk::{ + contract, contractimpl, contracttype, token, Address, BytesN, Env, String, Symbol, Vec, +}; + +pub use batch::ChargeResult; +pub use batch::CancelResult; +pub use charge_exec::ChargeSimResult; +pub use charge_exec::PayPerUseSimResult; + +// ───────────────────────────────────────────────────────────── +// Storage keys +// ───────────────────────────────────────────────────────────── + +#[contracttype] +#[derive(Clone)] +pub enum DataKey { + Subscription(Address), + Token, + // Admin + Admin, + // Grace period + GracePeriod, + // Merchant whitelist + MerchantWhitelist(Address), + WhitelistEnabled, + WhitelistIndex(u32), + WhitelistIndexSize, + // Merchant freeze: blocks new subscriptions, independent of whitelist status + MerchantFrozen(Address), + MerchantFreezeReason(Address), + // Protocol fee + FeeCollector, + FeeBps, + // Feature: subscription count + ActiveCount, + // Feature: merchant revenue stats + MerchantRevenue(Address), + // Per-day merchant revenue buckets (keyed by Unix day) + MerchantRevenueDay(Address, u64), + // Index of which days have revenue buckets for a merchant + MerchantRevenueDayIndex(Address), + // Feature: daily spending limits (temporary storage) + DailyLimit(Address), + DailySpent(Address), + DayStart(Address), + // Feature: referral tracking + Referral(Address), + // Feature: state migration + SchemaVersion, + // Feature: subscription metadata labels + SubscriptionMeta(Address), + // Feature: charge history + ChargeHistory(Address), + // Feature: global volume cap + GlobalVolumeWindow, + // Feature: batch size limit override + MaxBatchSize, + // Feature: contract pause + ContractPaused, + // Feature: minimum subscription interval floor + MinInterval, + // Feature: consolidated merchant revenue history (Vec) + MerchantRevenueHistory(Address), + // Feature: subscriber index (append-only log) + SubscriberIndex(u64), + SubscriberIndexSize, + // Reverse lookup of a subscriber's slot, used to prune on cancel + SubscriberIndexSlot(Address), + // Tombstone marking a pruned (cancelled) subscriber index slot + SubscriberIndexRemoved(u64), + // Feature: per-merchant subscriber count + MerchantSubCount(Address), + // Feature: merchant index for governance/ranking + MerchantIndex(u32), + MerchantIndexSize, + MerchantKnown(Address), + // Pending admin for two-step transfer + PendingAdmin, + // Two-step auth for protocol fee + PendingFee, + // Per-merchant custom fee recipient (merchant -> destination) + MerchantFeeRecipient(Address), + // Two-step auth for grace period + PendingGracePeriod, + // Two-step auth for upgrade + PendingUpgrade, + // Feature: pause expiry (bounded pause with auto-resume) + PauseExpiry(Address), + // Feature: cumulative protocol fees collected across all merchants + TotalProtocolFees, + // Feature: configurable global hourly volume cap override + GlobalVolumeCapOverride, + // Feature: configurable min/max fee bps bounds + MinFeeBps, + MaxFeeBps, + // Feature: configurable whitelist batch size limit override + MaxWhitelistBatchSize, +} + +// ───────────────────────────────────────────────────────────── +// Constants +// ───────────────────────────────────────────────────────────── + +pub const SUBSCRIPTION_TTL_LEDGERS: u32 = 6307200; // ~1 year (assuming 5s blocks) +pub const MAX_BATCH_PAUSE_SUBSCRIPTIONS: u32 = 25; +/// Default cap for the admin whitelist batch entrypoints. Overridable at +/// runtime via `set_max_whitelist_batch_size`, bounded by `MAX_BATCH_SIZE_CEILING`. +pub const MAX_WHITELIST_BATCH_SIZE: u32 = 50; +/// Hard ceiling shared by every admin-configurable batch limit. Configured +/// limits are never allowed above this value, so batches stay bounded even if +/// an admin key is compromised. +pub const MAX_BATCH_SIZE_CEILING: u32 = 200; +pub const GLOBAL_MAX_VOLUME_PER_HOUR: i128 = 50_000_000_000_000; // 50 trillion stroops +pub const HOUR_IN_SECONDS: u64 = 3600; +pub const MAX_AMOUNT: i128 = 100_000_000_000; +pub const MAX_SUBSCRIPTION_AMOUNT: i128 = 100_000_000_000_000; + +// ───────────────────────────────────────────────────────────── +// Data types +// ───────────────────────────────────────────────────────────── + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct Subscription { + pub merchant: Address, + pub amount: i128, + pub interval: u64, + pub last_charged: u64, + pub active: bool, + pub paused: bool, // true if paused, false otherwise + pub token: Address, // SAC token used for this subscription + pub referrer: Option
, // optional referral address + pub label: Symbol, // user-assigned label for this subscription + pub trial_duration: u64, // optional trial duration in seconds + pub created_at: u64, // timestamp of subscription creation +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct SubscriptionHealth { + pub active: bool, + pub charge_due: bool, + pub within_grace: bool, + pub has_sufficient_allowance: bool, + pub is_paused: bool, + pub trial_active: bool, + pub daily_limit_set: bool, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct DailyLimitStatus { + pub limit: Option, + pub spent: i128, + pub day_start: Option, + pub remaining: Option, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct HealthReport { + pub is_healthy: bool, + pub contract_paused: bool, + pub token_configured: bool, + pub admin_configured: bool, + /// Approximate instance TTL in ledgers. On-chain, this is a hardcoded + /// lower-bound estimate (100_000) because Soroban does not expose + /// `get_ttl()` outside test builds. Do not treat as precise. + pub instance_ttl_ledgers: u32, + pub active_subscription_count: u64, + pub schema_version: u32, + pub fee_collector_set: bool, + pub global_volume_utilization_pct: u32, + /// Number of merchants with unwithdrawn revenue > 0. + pub pending_merchant_rev_count: u32, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct GlobalVolumeWindow { + pub current_window_start: u64, + pub accumulated_volume: i128, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct ProtocolStats { + pub active_count: u64, + pub fee_bps: u32, + pub fee_collector: Option
, + pub grace_period: u64, + pub whitelist_enabled: bool, + pub schema_version: u32, + pub contract_paused: bool, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct ContractConfig { + pub fee_bps: u32, + pub fee_collector: Option
, + pub grace_period: u64, + pub min_interval: u64, + pub max_batch_size: u32, + pub global_volume_cap: i128, + pub whitelist_enabled: bool, + pub paused: bool, + pub schema_version: u32, +} + +// ───────────────────────────────────────────────────────────── +// Contract +// ───────────────────────────────────────────────────────────── + +pub(crate) fn cancel_inner(env: &Env, user: &Address) -> Subscription { + let key = DataKey::Subscription(user.clone()); + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + sub.active = false; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(env, user); + + subscription_count::decrement(env); + subscription_count::remove_subscriber_index(env, user); + merchant_stats::decrement_subscriber_count(env, &sub.merchant); + referral::remove_referral(env, user); + + sub +} + +#[contract] +pub struct FlowPay; + +#[contractimpl] +impl FlowPay { + /// One-time deploy entrypoint: persists the default SAC token and the + /// contract admin. Admin must authorize this invoke. + /// + /// Deploy scripts (`scripts/deploy-pipeline.ts`, `scripts/testnet-setup.ts`) + /// depend on these invariants: + /// - arity is `initialize(token, admin)` + /// - a second call returns typed `ContractError::AlreadyInitialized` (code 1) + /// - success stores both token and admin, readable via `get_token` / `get_admin` + pub fn initialize(env: Env, token: Address, admin: Address) { + bump_instance_ttl(&env); + + if env.storage().instance().has(&DataKey::Token) { + env.panic_with_error(ContractError::AlreadyInitialized); + } + + // Authorize and persist admin before writing Token so a missing/invalid + // admin signature cannot leave a token-only (partial) initialization. + admin::initialize_admin(&env, &admin); + env.storage().instance().set(&DataKey::Token, &token); + } + + /// Permissionlessly refreshes the shared instance storage TTL. + /// + /// Keeper liveness probes may call this entrypoint during read- or + /// simulation-heavy periods. It does not require auth, inspect pause + /// state, transfer funds, or mutate protocol state. + pub fn bump_instance_ttl(env: Env) { + bump_instance_ttl(&env); + } + + pub fn get_max_batch_size(env: Env) -> u32 { + batch::get_max_batch_size(&env) + } + + pub fn set_max_batch_size(env: Env, size: u32) { + admin::require_admin(&env); + if size > MAX_BATCH_SIZE_CEILING { + env.panic_with_error(ContractError::InvalidBatchSize); + } + env.storage().instance().set(&DataKey::MaxBatchSize, &size); + } + + /// Returns the batch cap applied to the admin whitelist batch entrypoints + /// (`whitelist_batch_add`, `whitelist_batch_remove`, `get_merchant_statuses`). + /// + /// This is a **separate** knob from `get_max_batch_size`, which bounds the + /// charge batches — see the design note in `whitelist.rs`. Defaults to + /// `MAX_WHITELIST_BATCH_SIZE` (50). + pub fn get_max_whitelist_batch_size(env: Env) -> u32 { + whitelist::get_max_whitelist_batch_size(&env) + } + + /// Admin-only: overrides the whitelist batch cap. + /// + /// Panics with `InvalidBatchSize` when `size` is zero or exceeds + /// `MAX_BATCH_SIZE_CEILING` (200), so whitelist batches always stay bounded. + pub fn set_max_whitelist_batch_size(env: Env, size: u32) { + admin::require_admin(&env); + whitelist::set_max_whitelist_batch_size(&env, size); + } + + pub fn get_contract_config(env: Env) -> ContractConfig { + ContractConfig { + fee_bps: fee::get_fee_bps(&env), + fee_collector: fee::get_fee_collector(&env), + grace_period: grace::get_grace_period(&env), + min_interval: min_interval::get_min_interval(&env), + max_batch_size: batch::get_max_batch_size(&env), + global_volume_cap: GLOBAL_MAX_VOLUME_PER_HOUR, + whitelist_enabled: whitelist::is_whitelist_enabled(&env), + paused: is_contract_paused(&env), + schema_version: env + .storage() + .instance() + .get(&DataKey::SchemaVersion) + .unwrap_or(1), + } + } + + pub fn get_batch_charge_estimate(env: Env, users: Vec
) -> Vec { + if users.len() > 200 { + env.panic_with_error(ContractError::BatchTooLarge); + } + let mut results: Vec = Vec::new(&env); + let now = env.ledger().timestamp(); + let grace_period = grace::get_grace_period(&env); + + for user in users.iter() { + let key = DataKey::Subscription(user.clone()); + let sub_opt: Option = env.storage().persistent().get(&key); + + let result = match sub_opt { + None => ChargeResult::NoSubscription, + Some(mut sub) => { + if sub.paused && charge_exec::try_auto_resume(&env, &user, &mut sub, now) { + // Auto-resumed — fall through to allowance check below. + // Re-run precheck on the now-active sub to be safe, then + // mirror the same allowance check as the live batch path. + match charge_exec::precheck_charge(&sub, now, grace_period) { + Err(skip) => skip, + Ok(()) => { + if !validation::has_sufficient_allowance( + &env, &user, &sub.token, sub.amount, + ) { + ChargeResult::AllowanceInsufficient + } else { + ChargeResult::Charged + } + } + } + } else { + match charge_exec::precheck_charge(&sub, now, grace_period) { + Err(skip) => skip, + Ok(()) => { + if !validation::has_sufficient_allowance( + &env, &user, &sub.token, sub.amount, + ) { + ChargeResult::AllowanceInsufficient + } else { + ChargeResult::Charged + } + } + } + } + } + }; + results.push_back(result); + } + results + } + + /// Creates or replaces a recurring subscription for `user`. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `merchant`: Recipient that receives recurring and pay-per-use transfers. + /// - `amount`: Amount transferred per billing period. Must be greater than zero. + /// - `interval`: Billing cadence in seconds. Must be greater than zero. + /// - `token`: Stellar Asset Contract used for this subscription. + /// - `trial_period`: Optional seconds to delay the first charge. + /// - `referrer`: Optional referrer stored for the subscriber. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, the merchant whitelist rejects `merchant`, + /// `amount` or `interval` is zero, or the contract allowance is below `amount`. + /// + /// # Side Effects + /// + /// Stores the subscription, refreshes its TTL, updates active subscription + /// count and referral storage, and emits `subscribed`. + pub fn subscribe( + env: Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, + ) { + subscribe_inner( + &env, + user, + merchant, + amount, + interval, + token, + trial_period, + referrer, + ); + } + + pub fn subscribe_with_metadata( + env: Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, + label: String, + ) { + if label.len() > 64 { + env.panic_with_error(ContractError::MetadataLabelTooLong); + } + + subscribe_inner( + &env, + user.clone(), + merchant, + amount, + interval, + token, + trial_period, + referrer, + ); + + let _ = subscription_metadata::set_metadata(&env, &user, label); + } + + /// Charges the next due recurring payment for `user`. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose active subscription should be charged. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// No subscriber signature is required. The contract spends through the + /// previously granted token allowance. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists, the subscription + /// is inactive or paused, the interval has not elapsed, the grace period has + /// elapsed, or token transfer authorization/allowance is insufficient. + /// + /// # Side Effects + /// + /// Transfers `amount` from `user` to the merchant, records merchant revenue + /// and charge history, refreshes subscription TTL, updates `last_charged`, + /// and emits `charged`. + pub fn charge(env: Env, user: Address) { + bump_instance_ttl(&env); + ensure_contract_not_paused(&env); + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + let now = env.ledger().timestamp(); + + if sub.paused { + if charge_exec::try_auto_resume(&env, &user, &mut sub, now) { + // Auto-resumed; fall through to charge immediately + } else { + env.panic_with_error(ContractError::SubscriptionPaused); + } + } else if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + let next = charge_exec::compute_next_charge_at(&sub) + .unwrap_or_else(|| env.panic_with_error(ContractError::SubscriptionPaused)); + + if now < next { + env.panic_with_error(ContractError::IntervalNotElapsed); + } + + let grace_period = grace::get_grace_period(&env); + if grace_period > 0 && now > next + grace_period { + env.panic_with_error(ContractError::GracePeriodElapsed); + } + + charge_exec::execute_charge(&env, &user, &key, &mut sub, now); + } + + pub fn extend_subscription_ttl(env: Env, user: Address) { + extend_subscription_ttl(&env, &user); + } + + /// Permissionlessly refreshes the TTL of any subscription entry. + /// Returns early (no-op) if no subscription exists for `user`. + /// No auth required — safe for keeper bots to call for dormant subscribers. + pub fn bump_subscription(env: Env, user: Address) { + extend_subscription_ttl(&env, &user); + } + + /// Bumps TTL for multiple subscription entries in a single call. + /// Returns a list of addresses whose TTLs were actually extended. + pub fn batch_extend_subscription_ttl(env: Env, users: Vec
) -> Vec
{ + batch::batch_extend_subscription_ttl(&env, users) + } + + /// Dry-run simulation of a charge call. Returns ChargeSimResult variant indicating + /// whether charge would succeed or the reason it would fail. + pub fn simulate_charge(env: Env, user: Address) -> ChargeSimResult { + charge_exec::simulate_charge(&env, user) + } + + /// Dry-run simulation of a `pay_per_use` call. Returns a PayPerUseSimResult + /// variant indicating whether the pay-per-use would succeed or the reason it + /// would fail (contract paused, invalid/inactive/paused subscription, daily + /// limit exceeded, or insufficient allowance). Performs no state writes. + pub fn simulate_pay_per_use(env: Env, user: Address, amount: i128) -> PayPerUseSimResult { + charge_exec::simulate_pay_per_use(&env, user, amount, None) + } + + /// Dry-run simulation of a `pay_per_use_to` call. Mirrors + /// `simulate_pay_per_use` but also validates the `recipient` (contract-address + /// self-reference and merchant whitelist). Performs no state writes. + pub fn simulate_pay_per_use_to( + env: Env, + user: Address, + amount: i128, + recipient: Address, + ) -> PayPerUseSimResult { + charge_exec::simulate_pay_per_use(&env, user, amount, Some(recipient)) + } + + /// Executes an immediate pay-per-use charge for an active subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `amount`: One-time amount to transfer. Must be greater than zero. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, `amount` is zero, no subscription + /// exists, the subscription is inactive or paused, the daily spending limit + /// would be exceeded, or token transfer authorization/allowance is insufficient. + /// + /// # Side Effects + /// + /// Transfers `amount` to the subscription merchant, updates merchant revenue + /// and daily spend tracking, and emits `pay_per_use`. + pub fn pay_per_use(env: Env, user: Address, amount: i128) { + bump_instance_ttl(&env); + pay_per_use_inner(&env, user, amount, None); + } + + /// Executes an immediate pay-per-use charge for an active subscription, + /// routing payment to `recipient` instead of the subscription's merchant. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `amount`: One-time amount to transfer. Must be greater than zero. + /// - `recipient`: Address that receives the net payment instead of `sub.merchant`. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Same as `pay_per_use`, plus panics if the merchant whitelist is enabled + /// and `recipient` is not whitelisted. + /// + /// # Side Effects + /// + /// Transfers `amount` to `recipient`, updates `recipient`'s merchant revenue + /// and the user's daily spend tracking (shared with `pay_per_use`), and + /// emits `pay_per_use` with `recipient` in place of `sub.merchant`. + pub fn pay_per_use_to(env: Env, user: Address, amount: i128, recipient: Address) { + pay_per_use_inner(&env, user, amount, Some(recipient)); + } + + pub fn get_day_start(env: Env, user: Address) -> Option { + spending_limit::get_day_start(&env, &user) + } + + /// Cancels `user`'s active subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists for `user`. + /// + /// # Side Effects + /// + /// Marks the subscription inactive, decrements active subscription count, and + /// emits `cancelled`. + pub fn cancel(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + cancel_inner(&env, &user); + events::publish_cancelled(&env, &user); + } + + /// Extends an active subscription's trial period (or delays next charge) + /// by adding `additional_seconds` to its `last_charged` timestamp. + /// + /// # Panics + /// - If `additional_seconds` is 0 (`IntervalMustBePositive`). + /// - If the subscription is cancelled/inactive (`SubscriptionInactive`). + /// - If the subscription is paused (`SubscriptionPaused`). + /// - If the subscription doesn't exist (`NoSubscriptionFound`). + /// - If `last_charged + additional_seconds` overflows `u64` (`ArithmeticOverflow`). + pub fn extend_trial(env: Env, user: Address, additional_seconds: u64) { + bump_instance_ttl(&env); + user.require_auth(); + trial::extend_trial(&env, &user, additional_seconds); + } + + pub fn cancel_and_refund_prorated(env: Env, user: Address, merchant: Address) { + bump_instance_ttl(&env); + user.require_auth(); + merchant.require_auth(); + + let key = DataKey::Subscription(user.clone()); + let sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + if sub.paused { + env.panic_with_error(ContractError::SubscriptionPaused); + } + if sub.merchant != merchant { + env.panic_with_error(ContractError::RefundMerchantMismatch); + } + + let now = env.ledger().timestamp(); + let elapsed = now.saturating_sub(sub.last_charged); + let remaining = sub.interval.saturating_sub(elapsed); + if sub.interval == 0 { + env.panic_with_error(ContractError::IntervalMustBePositive); + } + let refund = (sub.amount * i128::from(remaining)) / i128::from(sub.interval); + + if refund <= 0 { + env.panic_with_error(ContractError::RefundAmountMustBePositive); + } + + // Refunds are merchant-funded; no protocol escrow is used. Validate the + // source balance before the transfer so an underfunded merchant cannot + // reach an opaque SAC failure or a partial cancellation. + let token_client = token::Client::new(&env, &sub.token); + if token_client.balance(&merchant) < refund { + env.panic_with_error(ContractError::InsufficientMerchantBalance); + } + + token_client.transfer(&merchant, &user, &refund); + cancel_inner(&env, &user); + events::publish_cancelled_with_refund(&env, &user, refund); + } + + /// Pauses `user`'s subscription without cancelling it. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists or the subscription is inactive. + /// + /// # Side Effects + /// + /// Sets the subscription `paused` flag and emits `paused`. + pub fn pause(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + sub.paused = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + storage::set_pause_expiry(&env, &user, u64::MAX); + + events::publish_paused(&env, &user); + } + + /// Pauses `user`'s subscription until a specific expiry timestamp. + /// The subscription will auto-resume via `charge` or `batch_charge` + /// when the ledger timestamp reaches `expiry`. + pub fn pause_until(env: Env, user: Address, expiry: u64) { + bump_instance_ttl(&env); + user.require_auth(); + + let now = env.ledger().timestamp(); + if expiry <= now { + env.panic_with_error(ContractError::InvalidPauseExpiry); + } + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionNotActive); + } + + sub.paused = true; + sub.active = false; + + env.storage().persistent().set(&key, &sub); + storage::set_pause_expiry(&env, &user, expiry); + + events::publish_paused(&env, &user); + } + + /// Resumes `user`'s paused subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists or the subscription is inactive. + /// + /// # Side Effects + /// + /// Clears the subscription `paused` flag and emits `resumed`. + pub fn resume(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + // Reject cancelled subscriptions (inactive and not paused). + // pause_until sets active=false while paused=true; those must still be resumable. + if !sub.active && !sub.paused { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + // Recovery rule: if the grace window has closed the subscription is no longer + // chargeable. Resume is rejected to prevent false recoverability signals. + // The only allowed exit is cancel(); re-subscribe to restore chargeability. + // See docs/SUBSCRIBER-LIFECYCLE.md. + if grace::is_grace_lapsed(&env, &sub) { + env.panic_with_error(ContractError::ResumeGraceLapsed); + } + + sub.paused = false; + sub.active = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + storage::clear_pause_expiry(&env, &user); + + events::publish_resumed(&env, &user); + } + + /// Batch-pauses subscriptions for a list of user addresses. + /// + /// Admin-only emergency tool to freeze groups of related accounts in a + /// single transaction. The vector is capped at 25 items to stay within + /// ledger size constraints. + /// + /// # Parameters + /// + /// - `users`: List of subscriber addresses to pause. Max 25 items. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Side Effects + /// + /// For every valid active subscription, sets `paused = true`, persists the + /// update, extends the subscription TTL, and emits a `subscription_paused` + /// event. Invalid (non-existent) and already-paused entries are silently + /// skipped. The contract pause flag does **not** block this call. + pub fn batch_pause_subscriptions(env: Env, users: Vec
) { + admin::require_admin(&env); + + let max_batch: u32 = 25; + if users.len() > max_batch { + env.panic_with_error(ContractError::BatchTooLarge); + } + + for user in users.iter() { + let key = DataKey::Subscription(user.clone()); + + let sub_opt: Option = env.storage().persistent().get(&key); + if let Some(mut sub) = sub_opt { + if !sub.active || sub.paused { + if sub.paused { + extend_subscription_ttl(&env, &user); + } + continue; + } + + sub.paused = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + events::publish_subscription_paused(&env, &user); + } + } + } + + pub fn batch_cancel(env: Env, users: Vec
) -> Vec { + admin::require_admin(&env); + batch::batch_cancel(&env, users) + } + + /// Proposes a new admin (step 1 of two-step transfer). + /// The proposed address must call `accept_admin()` to complete the transfer. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + pub fn transfer_admin(env: Env, new_admin: Address) { + admin::transfer_admin(&env, &new_admin); + } + + /// Accepts a pending admin transfer (step 2 of two-step transfer). + /// Emits `admin_transferred` and replaces the active admin. + /// + /// # Auth + /// + /// Requires authorization from the pending (new) admin. + pub fn accept_admin(env: Env) { + admin::accept_admin(&env); + } + + /// Returns the proposed admin address awaiting `accept_admin()`, or + /// `None` if there is no pending transfer. + pub fn get_pending_admin(env: Env) -> Option
{ + admin::get_pending_admin(&env) + } + + /// Returns whether the contract is currently paused. + pub fn is_contract_paused(env: Env) -> bool { + is_contract_paused(&env) + } + + /// Returns the current admin address, or `None` if no admin has been set. + pub fn get_admin(env: Env) -> Option
{ + storage::get_admin_optional(&env) + } + + /// Returns the default token address set during `initialize()`, or `None` if not initialized. + pub fn get_token(env: Env) -> Option
{ + storage::get_token(&env) + } + + pub fn propose_upgrade(env: Env, new_wasm_hash: BytesN<32>) { + upgrade::propose_upgrade(&env, new_wasm_hash); + } + + pub fn cancel_pending_upgrade(env: Env) { + upgrade::cancel_pending_upgrade(&env); + } + + pub fn commit_upgrade(env: Env) { + upgrade::commit_upgrade(&env); + } + + /// Returns the pending WASM hash queued for the two-step upgrade flow, + /// or `None` if no upgrade has been proposed. + /// + /// # Auth + /// + /// None required — view-only read. + /// + /// # Storage + /// + /// Reads `DataKey::PendingUpgrade` from temporary storage (TTL ~24 h). + /// Returns `None` when the key has expired or was never set. + pub fn get_pending_upgrade(env: Env) -> Option> { + upgrade::get_pending_upgrade(&env) + } + + pub fn clear_fee(env: Env) { + admin::require_admin(&env); + fee::clear_fee(&env); + events::publish_fee_cleared(&env); + } + + pub fn get_fee_collector(env: Env) -> Option
{ + fee::get_fee_collector(&env) + } + + /// Returns the cumulative protocol fees collected across all merchants, + /// accumulated from every `charge()` and `pay_per_use()` call. + pub fn get_total_protocol_fees(env: Env) -> i128 { + fee::get_total_protocol_fees(&env) + } + + pub fn get_subscription(env: Env, user: Address) -> Option { + env.storage().persistent().get(&DataKey::Subscription(user)) + } + + pub fn get_subscription_age(env: Env, user: Address) -> Option { + let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; + + if sub.created_at == 0 { + return None; // sentinel for migrated/unknown subscriptions + } + + Some(env.ledger().timestamp() - sub.created_at) + } + + /// Returns the Unix timestamp of the next scheduled charge for a user. + /// + /// Returns `None` if no subscription exists, the subscription is inactive, + /// or the subscription is paused. + pub fn next_charge_at(env: Env, user: Address) -> Option { + let sub = storage::get_subscription(&env, &user)?; + charge_exec::compute_next_charge_at(&sub) + } + + /// Returns `true` when `user` has a charge due right now. + /// + /// A charge is due when: + /// - The subscription is active and not paused + /// - `now >= next_charge_at` (interval has elapsed) + /// - `now <= next_charge_at + grace_period` (still within grace window, or no grace period set) + /// + /// No auth required. + pub fn is_charge_due(env: Env, user: Address) -> bool { + let sub = match storage::get_subscription(&env, &user) { + Some(s) => s, + None => return false, + }; + let next = match charge_exec::compute_next_charge_at(&sub) { + Some(n) => n, + None => return false, + }; + let now = env.ledger().timestamp(); + if now < next { + return false; + } + let grace = grace::get_grace_period(&env); + if grace > 0 && now > next + grace { + return false; + } + true + } + + /// Returns the trial end timestamp if the user is in a trial period. + pub fn get_trial_end(env: Env, user: Address) -> Option { + trial::get_trial_end(env, user) + } + + /// Proposes a new contract-wide grace period for charges. + /// Only the contract admin can call this. + pub fn propose_grace_period(env: Env, seconds: u64) { + bump_instance_ttl(&env); + grace::propose_grace_period(&env, seconds); + } + + /// Commits a pending contract-wide grace period proposal. + /// Only the contract admin can call this. + pub fn commit_grace_period(env: Env) { + bump_instance_ttl(&env); + grace::commit_grace_period(&env); + } + + /// Returns the current grace period in seconds. Returns 0 if not set. + pub fn get_grace_period(env: Env) -> u64 { + grace::get_grace_period(&env) + } + + /// Updates the recurring charge amount for `user`'s subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose subscription amount should be adjusted. + /// - `new_amount`: Replacement amount for future charges. Must be positive + /// and must not exceed `MAX_SUBSCRIPTION_AMOUNT`. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists for `user`, + /// or `new_amount` fails amount validation. + /// + /// # Side Effects + /// + /// Overwrites the subscription's `amount` field in persistent storage, + /// refreshes its TTL, and emits `sub_amount_updated`. + pub fn set_subscription_amount(env: Env, user: Address, new_amount: i128) { + ensure_contract_not_paused(&env); + admin::require_admin(&env); + + validation::require_valid_amount(&env, new_amount); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + let old_amount = sub.amount; + sub.amount = new_amount; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + + events::publish_subscription_amount_updated(&env, &user, old_amount, new_amount); + } + + /// Updates the billing interval for `user`'s subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose subscription interval should be adjusted. + /// - `new_interval`: Replacement interval in seconds. Must be strictly + /// greater than zero. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists for `user`, + /// or `new_interval` is zero (`ContractError::IntervalTooShort`). + /// + /// # Side Effects + /// + /// Overwrites the subscription's `interval` field in persistent storage, + /// refreshes its TTL, and emits `sub_interval_updated`. The change takes + /// effect immediately: `next_charge_at` will return + /// `last_charged + new_interval` after this call. + pub fn set_subscription_interval(env: Env, user: Address, new_interval: u64) { + ensure_contract_not_paused(&env); + admin::require_admin(&env); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + validation::require_valid_interval(&env, new_interval); + + let old_interval = sub.interval; + sub.interval = new_interval; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + + events::publish_subscription_interval_updated(&env, &user, old_interval, new_interval); + } + + /// Sets the minimum allowed subscription interval in seconds. + /// Only the contract admin can call this. Panics if seconds == 0. + pub fn set_min_interval(env: Env, seconds: u64) { + assert!(seconds > 0, "min interval must be positive"); + admin::require_admin(&env); + min_interval::set_min_interval(&env, seconds); + } + + /// Returns the minimum allowed subscription interval in seconds. + /// Defaults to 3600 (1 hour) when unset. + pub fn get_min_interval(env: Env) -> u64 { + min_interval::get_min_interval(&env) + } + + /// Adds a merchant to the whitelist. + pub fn add_merchant(env: Env, merchant: Address) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::add_merchant(&env, &merchant); + } + + /// Removes a merchant from the whitelist. + pub fn remove_merchant(env: Env, merchant: Address) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::remove_merchant(&env, &merchant); + } + + /// Adds multiple merchants to the whitelist in a single call. + /// Admin-only. Duplicates are idempotent. + /// Returns the number of entries processed. + /// + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50); panics with + /// `BatchTooLarge` above it. + pub fn whitelist_batch_add(env: Env, merchants: Vec
) -> u32 { + admin::require_admin(&env); + + whitelist::require_batch_within_limit(&env, merchants.len()); + + for merchant in merchants.iter() { + whitelist::add_merchant(&env, &merchant); + } + + merchants.len() + } + + /// Removes multiple merchants from the whitelist in a single call. + /// Admin-only. Removing a non-whitelisted merchant is a no-op. + /// Returns the number of entries processed. + /// + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50); panics with + /// `BatchTooLarge` above it. + pub fn whitelist_batch_remove(env: Env, merchants: Vec
) -> u32 { + admin::require_admin(&env); + + whitelist::require_batch_within_limit(&env, merchants.len()); + + for merchant in merchants.iter() { + whitelist::remove_merchant(&env, &merchant); + } + + merchants.len() + } + + /// Enables or disables the merchant whitelist. + pub fn set_whitelist_enabled(env: Env, enabled: bool) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::set_whitelist_enabled(&env, enabled); + } + + /// Returns whether the merchant whitelist is currently enabled. Defaults to true. + pub fn get_whitelist_enabled(env: Env) -> bool { + whitelist::get_whitelist_enabled(&env) + } + + /// Returns whether the merchant whitelist is currently enabled. + pub fn is_whitelist_enabled(env: Env) -> bool { + whitelist::is_whitelist_enabled(&env) + } + + /// Returns whether a merchant is whitelisted. + pub fn is_merchant_whitelisted(env: Env, merchant: Address) -> bool { + whitelist::is_whitelisted(&env, &merchant) + } + + /// Returns a paginated vector of whitelisted merchants. + pub fn get_whitelist_page(env: Env, offset: u32, limit: u32) -> Vec
{ + whitelist::get_whitelist_page(&env, offset, limit) + } + + /// Returns the total count of whitelisted merchants. + pub fn get_whitelist_size(env: Env) -> u32 { + whitelist::get_whitelist_size(&env) + } + + /// Returns the whitelist and freeze status for a batch of merchant addresses. + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50) so the read path and the + /// admin write paths share one number. + pub fn get_merchant_statuses(env: Env, merchants: Vec
) -> Vec<(Address, bool, bool)> { + whitelist::require_batch_within_limit(&env, merchants.len()); + let mut result = Vec::new(&env); + for merchant in merchants.iter() { + let whitelisted = whitelist::is_whitelisted(&env, &merchant); + let frozen = whitelist::is_frozen(&env, &merchant); + result.push_back((merchant, whitelisted, frozen)); + } + result + } + + /// Returns top N merchants ranked by subscriber count in descending order. + /// `limit` is capped at 20; panics with `ContractError::BatchTooLarge` if exceeded. + pub fn get_top_merchants_by_subs(env: Env, limit: u32) -> Vec<(Address, u32)> { + merchant_stats::get_top_merchants_by_subs(&env, limit) + } + + /// Sets a custom fee recipient for a merchant. The caller must be the merchant. + /// The recipient cannot be the contract address and contract must not be paused. + pub fn set_merchant_fee_recipient(env: Env, merchant: Address, recipient: Address) { + ensure_contract_not_paused(&env); + fee::set_merchant_fee_recipient(&env, &merchant, &recipient); + } + + /// Returns the configured merchant fee recipient, or None when unset. + pub fn get_merchant_fee_recipient(env: Env, merchant: Address) -> Option
{ + fee::get_merchant_fee_recipient(&env, &merchant) + } + + /// Freezes a merchant, blocking new subscriptions while leaving existing + /// subscribers' charge and pay_per_use calls unaffected. Independent of + /// whitelist status — idempotent. + pub fn freeze_merchant(env: Env, merchant: Address, reason: Option) { + admin::require_admin(&env); + whitelist::freeze(&env, &merchant, reason); + } + + /// Unfreezes a merchant, allowing new subscriptions again. Idempotent. + pub fn unfreeze_merchant(env: Env, merchant: Address) { + admin::require_admin(&env); + whitelist::unfreeze(&env, &merchant); + } + + /// Returns the reason a merchant was frozen, if any. + pub fn get_merchant_freeze_reason(env: Env, merchant: Address) -> Option { + whitelist::get_freeze_reason(&env, &merchant) + } + + /// Extends the TTL of a specific merchant daily revenue bucket. + pub fn bump_merchant_revenue_day(env: Env, merchant: Address, day: u64) { + merchant_stats::bump_merchant_revenue_day(&env, &merchant, day); + } + + /// Prunes missing or expired daily revenue buckets safely. Admin only. + pub fn prune_merchant_revenue_days(env: Env, merchant: Address, days: Vec) { + merchant_stats::prune_merchant_revenue_days(&env, &merchant, days); + } + + /// Retrieves a specific daily revenue bucket. Returns 0 if missing. + pub fn get_merchant_revenue_day(env: Env, merchant: Address, day: u64) -> i128 { + merchant_stats::get_merchant_revenue_day(&env, &merchant, day) + } + + /// Returns paginated per-day revenue pairs for a merchant. + /// Limit is capped at 30. Returns an empty Vec if no history or out of bounds. + pub fn get_merchant_revenue_day_page( + env: Env, + merchant: Address, + offset: u32, + limit: u32, + ) -> Vec<(u64, i128)> { + merchant_stats::get_merchant_revenue_day_page(&env, &merchant, offset, limit) + } + + /// Returns whether a merchant is currently frozen. + pub fn is_merchant_frozen(env: Env, merchant: Address) -> bool { + whitelist::is_frozen(&env, &merchant) + } + + /// Returns the current protocol fee settings, or `None` if unset. + pub fn get_fee(env: Env) -> Option<(Address, u32)> { + fee::get_fee_collector(&env).map(|collector| (collector, fee::get_fee_bps(&env))) + } + + /// Proposes new protocol fee collection settings (step 1 of two-step commit). + /// Stores the proposed `(collector, bps)` in temporary storage and emits + /// `fee_proposed`. Must be followed by `commit_fee()` to take effect. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + /// + /// # Errors + /// + /// Panics if `bps > 10000` (`InvalidFeeBps`) or if `collector` is the + /// contract's own address (`InvalidFeeCollector`). + pub fn propose_fee(env: Env, collector: Address, bps: u32) { + bump_instance_ttl(&env); + admin::require_admin(&env); + fee::propose_fee(&env, collector, bps); + } + + /// Commits a pending fee proposal (step 2 of two-step commit). + /// Reads the pending `(collector, bps)` from temporary storage, applies it + /// to instance storage, removes the pending entry, and emits `fee_committed`. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + /// + /// # Errors + /// + /// Panics with `NoPendingProposal` if no pending fee exists. + pub fn commit_fee(env: Env) { + bump_instance_ttl(&env); + admin::require_admin(&env); + fee::commit_fee(&env); + } + + // ───────────────────────────────────────────────────────────── + // Batch charge + // ───────────────────────────────────────────────────────────── + + /// Charges multiple subscribers in a single transaction. + /// + /// Each user is processed independently — individual failures (inactive, + /// paused, interval not elapsed, etc.) are recorded as a `ChargeResult` + /// variant and do **not** abort the batch. + pub fn batch_charge(env: Env, users: Vec
) -> Vec { + bump_instance_ttl(&env); + ensure_contract_not_paused(&env); + batch::batch_charge(&env, users) + } + + // ───────────────────────────────────────────────────────────── + // Subscription count + // ───────────────────────────────────────────────────────────── + + /// Returns the current number of active subscriptions. + pub fn get_active_count(env: Env) -> u64 { + subscription_count::get_active_count(&env) + } + + // ───────────────────────────────────────────────────────────── + // Subscriber index + // ───────────────────────────────────────────────────────────── + + /// Returns the total number of unique subscribers ever recorded (append-only count). + pub fn get_subscriber_count(env: Env) -> u64 { + subscription_count::get_subscriber_index_size(&env) + } + + /// Returns the subscriber address at the given index slot, or `None` if + /// out of range or the slot has been pruned (cancelled subscriber). + pub fn get_subscriber_at(env: Env, index: u64) -> Option
{ + if subscription_count::is_subscriber_index_removed(&env, index) { + return None; + } + env.storage() + .persistent() + .get(&DataKey::SubscriberIndex(index)) + } + + /// Returns a page of subscriber addresses starting at `offset`, capped at 50 per call. + /// Pruned (cancelled) slots are skipped. Returns an empty Vec when + /// `offset >= count` or `limit == 0`. + pub fn get_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ + let count = subscription_count::get_subscriber_index_size(&env); + let cap: u32 = if limit > 50 { 50 } else { limit }; + let mut result = Vec::new(&env); + if offset >= count || cap == 0 { + return result; + } + let mut i = offset; + let end = offset + cap as u64; + while i < end && i < count { + if !subscription_count::is_subscriber_index_removed(&env, i) { + if let Some(addr) = env.storage().persistent().get(&DataKey::SubscriberIndex(i)) { + result.push_back(addr); + } + } + i += 1; + } + result + } + + /// Returns a list of subscriber addresses that are currently due for charging. + /// Reads from the `SubscriberIndex` starting from `offset` up to `offset + limit`. + /// Capped at 50 per call. Optionally filters out grace-lapsed subscriptions when + /// `exclude_lapsed` is `Some(true)` or `None`. + pub fn get_next_charge_batch( + env: Env, + offset: u64, + limit: u32, + exclude_lapsed: Option, + ) -> Vec
{ + if limit > 50 { + env.panic_with_error(ContractError::BatchTooLarge); + } + let size = subscription_count::get_subscriber_index_size(&env); + let mut result = Vec::new(&env); + if offset >= size || limit == 0 { + return result; + } + let exclude = exclude_lapsed.unwrap_or(true); + let mut i = offset; + let end = (offset + limit as u64).min(size); + while i < end { + if !subscription_count::is_subscriber_index_removed(&env, i) { + if let Some(addr) = env.storage().persistent().get::(&DataKey::SubscriberIndex(i)) { + if let Some(sub) = storage::get_subscription(&env, &addr) { + if let Some(next) = charge_exec::compute_next_charge_at(&sub) { + let now = env.ledger().timestamp(); + if now >= next { + let grace = grace::get_grace_period(&env); + let lapsed = grace > 0 && now > next + grace; + if !exclude || !lapsed { + result.push_back(addr); + } + } + } + } + } + } + i += 1; + } + result + } + + /// Extends the TTL of all subscriber index entries to prevent archival. + /// + /// Iterates `SubscriberIndex(0..size)` and calls `extend_ttl` on each, + /// along with `SubscriberIndexSize`, `SubscriberIndexSlot`, and + /// `SubscriberIndexRemoved` entries. Bumps TTL to `SUBSCRIPTION_TTL_LEDGERS`. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Side Effects + /// + /// Extends the TTL of every persistent subscriber index entry and emits + /// a `subscriber_index_ttl_extended` event with the total count. + pub fn extend_subscriber_index_ttl(env: Env) { + admin::require_admin(&env); + + let size = subscription_count::get_subscriber_index_size(&env); + + if size == 0 { + return; + } + + // Extend the size counter itself + env.storage().persistent().extend_ttl( + &DataKey::SubscriberIndexSize, + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + + let mut count: u64 = 0; + let mut i: u64 = 0; + while i < size { + let key = DataKey::SubscriberIndex(i); + env.storage().persistent().extend_ttl( + &key, + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + count += 1; + i += 1; + } + + events::publish_subscriber_index_ttl_extended(&env, count); + } + + /// Admin-only repair: tombstones a single stale subscriber index slot. + /// + /// Looks up the occupant of `index`, refuses if that subscriber currently + /// has an active subscription, then marks the slot removed so keepers skip + /// it. This does **not** garbage-collect the rest of the index. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics with `NoSubscriptionFound` if `index` is out of range, empty, or + /// already tombstoned. Panics with `CannotClearActiveSubscriber` if the + /// occupant still has an active subscription. + /// + /// # Side Effects + /// + /// Writes `SubscriberIndexRemoved(index)`, drops the reverse slot lookup + /// when it points at this index, and emits `subscriber_index_cleared`. + pub fn clear_subscriber_index_entry(env: Env, index: u64) { + admin::require_admin(&env); + let user = subscription_count::clear_subscriber_index_entry(&env, index); + events::publish_subscriber_index_cleared(&env, &user, index); + } + + // ───────────────────────────────────────────────────────────── + // Merchant revenue + // ───────────────────────────────────────────────────────────── + + /// Returns the total amount charged to a merchant's subscribers + /// (sum of all successful `charge()` and `pay_per_use()` calls). + pub fn get_merchant_revenue(env: Env, merchant: Address) -> i128 { + merchant_stats::get_merchant_revenue(&env, &merchant) + } + + /// Returns per-charge revenue entries for the merchant (up to `days` most recent). + /// Oldest -> newest. Returns an empty Vec when no history has been recorded or after clearing. + pub fn get_merchant_revenue_history(env: Env, merchant: Address, days: u32) -> Vec { + merchant_stats::get_merchant_revenue_history(&env, &merchant, days) + } + + /// Returns aggregate revenue statistics for a merchant: (total, count, min_charge, max_charge). + pub fn get_merchant_revenue_summary(env: Env, merchant: Address) -> (i128, i128, i128, i128) { + merchant_stats::get_merchant_revenue_summary(&env, &merchant) + } + + /// Returns a composite health report for a user's subscription. + pub fn get_subscription_health(env: Env, user: Address) -> SubscriptionHealth { + let sub = match storage::get_subscription(&env, &user) { + Some(s) => s, + None => { + return SubscriptionHealth { + active: false, + charge_due: false, + within_grace: false, + has_sufficient_allowance: false, + is_paused: false, + trial_active: false, + daily_limit_set: false, + } + } + }; + + let active = sub.active; + let is_paused = sub.paused; + let charge_due = Self::is_charge_due(env.clone(), user.clone()); + + let next_charge = charge_exec::compute_next_charge_at(&sub); + let now = env.ledger().timestamp(); + let grace = grace::get_grace_period(&env); + + let within_grace = if let Some(next) = next_charge { + now >= next && grace > 0 && now <= next + grace + } else { + false + }; + + let has_sufficient_allowance = + validation::has_sufficient_allowance(&env, &user, &sub.token, sub.amount); + + let trial_active = trial::get_trial_end(env.clone(), user.clone()).is_some(); + let daily_limit_set = spending_limit::get_daily_limit(&env, &user).is_some(); + + SubscriptionHealth { + active, + charge_due, + within_grace, + has_sufficient_allowance, + is_paused, + trial_active, + daily_limit_set, + } + } + + /// Clears the merchant's revenue history Vec from persistent storage. + /// Only the contract admin can call this. Idempotent — safe to call when no history exists. + /// Does not affect the cumulative revenue total. + pub fn clear_merchant_revenue_history(env: Env, merchant: Address) { + admin::require_admin(&env); + merchant_stats::clear_revenue_history(&env, &merchant); + events::publish_merchant_history_cleared(&env, &merchant); + } + + /// Returns the number of active subscribers for a given merchant. + pub fn get_merchant_subscriber_count(env: Env, merchant: Address) -> u64 { + merchant_stats::get_merchant_subscriber_count(&env, &merchant) + } + + /// Returns the number of active subscribers for a given merchant (as u32). + pub fn get_merchant_sub_count(env: Env, merchant: Address) -> u32 { + subscription_count::get_merchant_sub_count(&env, &merchant) + } + + /// Returns active subscriber counts for multiple merchants in a single call. + /// Capped at 50 merchants; panics with `BatchTooLarge` above that. + /// Returns `(addr, 0)` for merchants with no recorded count. + /// No auth required. + pub fn get_merchant_sub_counts(env: Env, merchants: Vec
) -> Vec<(Address, u32)> { + merchant_stats::get_merchant_sub_counts(&env, &merchants) + } + + /// Resets a merchant's cumulative revenue counter to zero. + /// Only the contract admin can call this. + pub fn reset_merchant_revenue(env: Env, merchant: Address) { + admin::require_admin(&env); + merchant_stats::reset_merchant_revenue(&env, &merchant); + } + + /// Withdraws the merchant's accrued revenue from the contract balance + /// to their address. + /// + /// # Parameters + /// + /// - `merchant`: The merchant address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `merchant`. + /// + /// # Errors + /// + /// Panics if the contract is paused, the global token is not configured, + /// or the tracked accrued balance is zero or negative + /// (`ContractError::ZeroBalanceAvailable`). + /// + /// # Side Effects + /// + /// Resets the `MerchantRevenue` counter to zero before transferring + /// (reentrancy safety), then transfers tokens from the contract account + /// to `merchant` and emits `merchant_withdrawal`. + pub fn withdraw_merchant_revenue(env: Env, merchant: Address) { + ensure_contract_not_paused(&env); + merchant.require_auth(); + + let token_addr = storage::get_token(&env) + .unwrap_or_else(|| env.panic_with_error(ContractError::NotInitialized)); + + let amount = merchant_stats::get_merchant_revenue(&env, &merchant); + if amount <= 0 { + env.panic_with_error(ContractError::ZeroBalanceAvailable); + } + + // Reset before transfer to guard against reentrancy. + merchant_stats::reset_merchant_revenue(&env, &merchant); + + let token_client = token::Client::new(&env, &token_addr); + token_client.transfer(&env.current_contract_address(), &merchant, &amount); + + events::publish_merchant_withdrawal(&env, &merchant, amount); + } + + // ───────────────────────────────────────────────────────────── + // Daily spending limits + // ───────────────────────────────────────────────────────────── + + /// Sets a daily spending cap for `pay_per_use()` for the calling user. + /// Stored in temporary storage; resets automatically after ~1 day. + pub fn set_daily_limit(env: Env, user: Address, limit: i128) { + user.require_auth(); + if limit <= 0 { + env.panic_with_error(ContractError::AmountMustBePositive); + } + spending_limit::set_daily_limit(&env, &user, limit); + events::publish_daily_limit_set(&env, &user, limit); + } + + /// Returns the daily spending limit for a user, or `None` if not set. + /// Removes the caller's daily spending cap for `pay_per_use()`. + pub fn remove_daily_limit(env: Env, user: Address) { + user.require_auth(); + spending_limit::remove_daily_limit(&env, &user); + events::publish_daily_limit_removed(&env, &user); + } + + /// Returns the current daily spending limit for the caller, or `None` if unset. + pub fn get_daily_limit(env: Env, user: Address) -> Option { + spending_limit::get_daily_limit(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + /// Returns the amount spent so far today via `pay_per_use()` for the caller. + pub fn get_daily_spent(env: Env, user: Address) -> i128 { + spending_limit::get_daily_spent(&env, &user) + } + + /// Returns a consistent snapshot of a user's daily spending window. + /// `remaining` is `None` when no limit is configured and is clamped to + /// zero when spending has reached or exceeded the configured limit. + pub fn get_daily_limit_status(env: Env, user: Address) -> DailyLimitStatus { + spending_limit::get_daily_limit_status(&env, &user) + } + + // ───────────────────────────────────────────── + // Referral tracking + // ───────────────────────────────────────────────────────────── + + /// Returns the referrer address for a given subscriber, or `None`. + pub fn get_referral(env: Env, user: Address) -> Option
{ + referral::get_referrer(&env, &user) + } + + /// Returns the referrer address for a given subscriber, or `None`. + pub fn get_referrer(env: Env, user: Address) -> Option
{ + referral::get_referrer(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + // State migration + // ───────────────────────────────────────────────────────────── + + /// Migrates contract storage to the latest schema version. + /// Safe to call multiple times — subsequent calls are no-ops. + pub fn migrate(env: Env, users: Vec
) { + migration::migrate(&env, users); + } + + /// Returns the current storage schema version. + pub fn get_schema_version(env: Env) -> u32 { + migration::get_schema_version(&env) + } + + // ───────────────────────────────────────────────────────────── + // Subscription metadata + // ───────────────────────────────────────────────────────────── + + /// Attaches a short label (e.g. plan name) to the caller's subscription. + pub fn set_metadata(env: Env, user: Address, label: String) { + user.require_auth(); + if let Err(err) = subscription_metadata::set_metadata(&env, &user, label) { + env.panic_with_error(err); + } + } + + /// Returns the metadata label for a subscriber, or `None` if not set. + pub fn get_metadata(env: Env, user: Address) -> Option { + subscription_metadata::get_metadata(&env, &user) + } + + /// Alias for `get_metadata` — returns the metadata label for a subscriber, or `None` if not set. + pub fn get_subscription_label(env: Env, user: Address) -> Option { + subscription_metadata::get_metadata(&env, &user) + } + + /// Clears the metadata label for the caller's subscription. + pub fn clear_metadata(env: Env, user: Address) { + user.require_auth(); + subscription_metadata::clear_metadata(&env, &user); + } + + // ───────────────────────────────────────────────────────────── + // Charge history + // ───────────────────────────────────────────────────────────── + + /// Returns the last (up to 12) charge timestamps for a subscriber, + /// ordered oldest → newest. + pub fn get_charge_history(env: Env, user: Address) -> Vec { + subscription_history::get_charge_history(&env, &user) + } + + /// Returns the count of stored charge timestamps for a subscriber. + pub fn get_charge_history_count(env: Env, user: Address) -> u32 { + subscription_history::get_charge_history_count(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + // Protocol stats + // ───────────────────────────────────────────────────────────── + + /// Returns a snapshot of all protocol-level state in a single call. + pub fn get_protocol_stats(env: Env) -> ProtocolStats { + ProtocolStats { + active_count: subscription_count::get_active_count(&env), + fee_bps: fee::get_fee_bps(&env), + fee_collector: fee::get_fee_collector(&env), + grace_period: grace::get_grace_period(&env), + whitelist_enabled: whitelist::is_whitelist_enabled(&env), + schema_version: migration::get_schema_version(&env), + contract_paused: env + .storage() + .instance() + .get(&DataKey::ContractPaused) + .unwrap_or(false), + } + } + + // ───────────────────────────────────────────────────────────── + // Contract pause + // ───────────────────────────────────────────────────────────── + + /// Pauses the contract. Only the admin can call this. + pub fn pause_contract(env: Env) { + admin::require_admin(&env); + storage::set_contract_paused(&env, true); + events::publish_contract_paused(&env); + } + + /// Unpauses the contract. Only the admin can call this. + pub fn unpause_contract(env: Env) { + admin::require_admin(&env); + storage::set_contract_paused(&env, false); + events::publish_contract_unpaused(&env); + } + + // Admin setup + // ───────────────────────────────────────────────────────────── + + /// Bootstrap-only entrypoint that writes the contract admin when no admin + /// is configured. This is a narrower alternative to [`Self::initialize`]: + /// + /// - **`initialize(token, admin)`** atomically sets the default token *and* + /// the admin together. Use this for standard deployments via + /// `scripts/deploy-pipeline.ts` — it is the canonical full-init path. + /// - **`set_initial_admin(admin)`** sets only the admin slot. It is + /// intended for partial-recovery or segmented-deploy scenarios where the + /// token is written separately (or not at all), and admin-only governance + /// is needed before full initialization. + /// + /// In both cases the proposed admin must sign the call via + /// `require_auth()`, and a second call on an already-configured contract + /// fails with a typed `ContractError::AdminAlreadySet` (code 42) so + /// deploy scripts can detect the condition without string-parsing panics. + pub fn set_initial_admin(env: Env, admin: Address) { + admin.require_auth(); + if env.storage().instance().has(&DataKey::Admin) { + env.panic_with_error(ContractError::AdminAlreadySet); + } + storage::set_admin(&env, &admin); + } + + // ───────────────────────────────────────────────────────────── + // Health check + // ───────────────────────────────────────────────────────────── + + /// Returns a snapshot of contract health. Safe to call at any time — no auth required, no storage writes. + pub fn contract_health_check(env: Env) -> HealthReport { + let contract_paused = storage::is_contract_paused(&env); + let token_configured = storage::get_token(&env).is_some(); + let admin_configured = storage::get_admin_optional(&env).is_some(); + let fee_collector_set = fee::get_fee_collector(&env).is_some(); + + #[cfg(any(test, feature = "testutils"))] + let instance_ttl_ledgers = { + use soroban_sdk::testutils::storage::Instance as _; + env.storage().instance().get_ttl() + }; + #[cfg(not(any(test, feature = "testutils")))] + let instance_ttl_ledgers = 100_000; // at least 1 day of TTL remaining, used as default since get_ttl is not available on-chain + + let active_subscription_count = subscription_count::get_active_count(&env); + let schema_version = migration::get_schema_version(&env); + + let window: Option = + env.storage().instance().get(&DataKey::GlobalVolumeWindow); + let accumulated_volume = window.map(|w| w.accumulated_volume).unwrap_or(0); + let cap = env + .storage() + .instance() + .get(&DataKey::GlobalVolumeCapOverride) + .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR); + + let pct = if cap > 0 { + ((accumulated_volume * 100) / cap) as u32 + } else { + 0 + }; + let global_volume_utilization_pct = if pct > 100 { 100 } else { pct }; + + let total_merchants = merchant_stats::get_merchant_index_size(&env); + let mut pending_merchant_rev_count = 0; + for i in 0..total_merchants { + if let Some(merchant) = env.storage().persistent().get(&DataKey::MerchantIndex(i)) { + if merchant_stats::get_merchant_revenue(&env, &merchant) > 0 { + pending_merchant_rev_count += 1; + } + } + } + + // Healthy when not paused, fully configured, and at least 1 day of TTL remaining (17_280 ledgers at ~5 s/ledger) + let is_healthy = !contract_paused + && token_configured + && admin_configured + && instance_ttl_ledgers > 17_280; + + HealthReport { + is_healthy, + contract_paused, + token_configured, + admin_configured, + instance_ttl_ledgers, + active_subscription_count, + schema_version, + fee_collector_set, + global_volume_utilization_pct, + pending_merchant_rev_count, + } + } + + /// Clears the charge history for a subscriber. + /// Only the contract admin can call this. + pub fn clear_charge_history(env: Env, user: Address) { + admin::require_admin(&env); + subscription_history::clear_charge_history(&env, &user); + } + + /// Admin-only: removes the ChargeHistory entry for `user` entirely. + pub fn prune_charge_history(env: Env, user: Address) { + admin::require_admin(&env); + subscription_history::prune_charge_history(&env, &user); + } + + /// Returns the current TTL (in ledgers) of the ChargeHistory entry, or 0 if absent. + pub fn get_charge_history_ttl(env: Env, user: Address) -> u32 { + subscription_history::get_charge_history_ttl(&env, &user) + } + + /// Returns a paginated slice of charge timestamps for a subscriber. + /// limit is capped at 12. If `ascending` is false, records are returned in descending order (newest first). + pub fn get_charge_history_page( + env: Env, + user: Address, + offset: u32, + limit: u32, + ascending: bool, + ) -> Vec { + subscription_history::get_charge_history_page(&env, &user, offset, limit, ascending) + } + + /// Transfers subscription ownership from `user` to `new_user`. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, no active subscription exists for + /// `user`, or `new_user` already holds an active subscription. + /// + /// # Side Effects + /// + /// Moves the subscription struct to `new_user`, removes it from `user`, + /// refreshes TTL, and emits `sub_transferred` and `subscription_transferred`. + pub fn transfer_subscription(env: Env, user: Address, new_user: Address) { + ensure_contract_not_paused(&env); + validation::require_valid_transfer_targets(&env, &user, &new_user); + user.require_auth(); + new_user.require_auth(); + + let old_key = DataKey::Subscription(user.clone()); + let new_key = DataKey::Subscription(new_user.clone()); + + let sub: Subscription = env + .storage() + .persistent() + .get(&old_key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::NoSubscriptionFound); + } + + if let Some(existing) = env + .storage() + .persistent() + .get::(&new_key) + { + if existing.active { + env.panic_with_error(ContractError::SubscriptionAlreadyActive); + } + } + + env.storage().persistent().set(&new_key, &sub); + env.storage().persistent().remove(&old_key); + + subscription_count::transfer_subscriber_index(&env, &user, &new_user); + extend_subscription_ttl(&env, &new_user); + + events::publish_subscription_transferred(&env, &user, &new_user); + events::emit_subscription_transferred(&env, &user, &new_user, &sub); + } + + // ───────────────────────────────────────────────────────────── + // Configurable global hourly volume cap + // ───────────────────────────────────────────────────────────── + + /// Returns the currently effective global hourly volume cap (stroops). + /// Falls back to the compile-time `GLOBAL_MAX_VOLUME_PER_HOUR` default + /// when no operator override has been configured. + pub fn get_global_volume_cap(env: Env) -> i128 { + env.storage() + .instance() + .get(&DataKey::GlobalVolumeCapOverride) + .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR) + } + + /// Returns the current global volume window as `(accumulated_volume, window_start_timestamp)`. + /// Returns `(0, 0)` if no window has been started yet. + /// No auth required. + pub fn get_global_volume_window(env: Env) -> (i128, u64) { + let window: Option = + env.storage().instance().get(&DataKey::GlobalVolumeWindow); + match window { + Some(w) => (w.accumulated_volume, w.current_window_start), + None => (0, 0), + } + } + + /// Admin-only: overrides the global hourly volume cap without requiring + /// a contract upgrade. `new_cap` must be strictly positive. + pub fn set_global_volume_cap(env: Env, new_cap: i128) { + admin::require_admin(&env); + if new_cap <= 0 { + env.panic_with_error(ContractError::InvalidVolumeCap); + } + env.storage() + .instance() + .set(&DataKey::GlobalVolumeCapOverride, &new_cap); + } + + // ───────────────────────────────────────────────────────────── + // Configurable fee bounds (governance guardrails) + // ───────────────────────────────────────────────────────────── + + /// Admin-only: configures the allowed [min_bps, max_bps] range for + /// future fee proposals, guarding against accidental fee misconfiguration + /// (e.g. an operator typo setting bps close to 10000). + pub fn set_fee_bounds(env: Env, min_bps: u32, max_bps: u32) { + admin::require_admin(&env); + if min_bps > max_bps || max_bps > 10_000 { + env.panic_with_error(ContractError::InvalidFeeBounds); + } + env.storage().instance().set(&DataKey::MinFeeBps, &min_bps); + env.storage().instance().set(&DataKey::MaxFeeBps, &max_bps); + } + + /// Returns the configured (min_bps, max_bps) fee bounds, defaulting to + /// (0, 10000) when governance has not configured explicit bounds. + pub fn get_fee_bounds(env: Env) -> (u32, u32) { + let min_bps = env + .storage() + .instance() + .get(&DataKey::MinFeeBps) + .unwrap_or(0u32); + let max_bps = env + .storage() + .instance() + .get(&DataKey::MaxFeeBps) + .unwrap_or(10_000u32); + (min_bps, max_bps) + } + + // ───────────────────────────────────────────────────────────── + // Lightweight subscription reads + // ───────────────────────────────────────────────────────────── + + /// Returns the token address for a user's subscription without decoding + /// the full `Subscription` struct. + /// + /// Returns `Some(token)` when any subscription record exists for `user` + /// (including inactive/cancelled ones), and `None` when the user has never + /// subscribed. + /// + /// No auth required (view-only). + pub fn get_subscription_token(env: Env, user: Address) -> Option
{ + let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; + Some(sub.token) + } + + /// Returns just the merchant address for a user's subscription, without + /// decoding the full `Subscription` struct. Lighter-weight than + /// `get_subscription` for callers that only need to know which merchant + /// a user subscribes to. + pub fn get_subscriber_merchant(env: Env, user: Address) -> Option
{ + let sub: Subscription = env + .storage() + .persistent() + .get(&DataKey::Subscription(user))?; + Some(sub.merchant) + } + + /// Returns a page of subscriber addresses starting at `offset`, capped + /// at 50 per call, filtered to only those whose subscription is + /// currently active. Avoids forcing callers to over-fetch via + /// `get_subscriber_page` and filter client-side. + /// + /// # Pagination semantics (Issue #823) + /// + /// `offset` is a **slot index** in the append-only subscriber index, not + /// a result count. The function scans slots `[offset, offset+cap)` (where + /// `cap = min(limit, 50)`), skipping tombstoned and inactive entries. + /// Callers **must** advance `offset` by `cap` on each call to avoid + /// overlap or gaps: + /// + /// ```text + /// page = get_active_subscriber_page(offset, limit) + /// process(page) + /// offset += cap // cap = min(limit, 50) + /// ``` + /// + /// A page may return fewer than `cap` results when slots are tombstoned + /// or contain inactive subscriptions. An empty page signals the end of + /// the index. The scan is bounded: at most `cap` slots are examined per + /// call, preventing unbounded iteration even on sparse indexes. + pub fn get_active_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ + let count = subscription_count::get_subscriber_index_size(&env); + let cap: u32 = if limit > 50 { 50 } else { limit }; + let mut result = Vec::new(&env); + if offset >= count || cap == 0 { + return result; + } + let end = (offset + cap as u64).min(count); + let mut i = offset; + while i < end { + if subscription_count::is_subscriber_index_removed(&env, i) { + i += 1; + continue; + } + if let Some(addr) = env + .storage() + .persistent() + .get::(&DataKey::SubscriberIndex(i)) + { + if let Some(sub) = env + .storage() + .persistent() + .get::(&DataKey::Subscription(addr.clone())) + { + if sub.active { + result.push_back(addr); + } + } + } + i += 1; + } + result + } +} + +#[contractimpl] +#[cfg(test)] +impl FlowPay { + /// Upgrades the current contract WASM to `new_wasm_hash` (test only). + pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { + upgrade::upgrade(&env, new_wasm_hash); + } +} + +/// Refreshes the contract instance's TTL. Instance storage holds shared +/// protocol state (Admin, Token, FeeCollector, FeeBps, GracePeriod, +/// WhitelistEnabled, SchemaVersion, ActiveCount, ...) which all share one +/// TTL — if it lapses from prolonged inactivity, the contract is bricked. +/// Called at the start of every state-mutating public function so any +/// active use continuously keeps the instance alive without a keeper. +fn bump_instance_ttl(env: &Env) { + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS / 2, SUBSCRIPTION_TTL_LEDGERS); +} + +fn extend_subscription_ttl(env: &Env, user: &Address) { + storage::extend_subscription_ttl(env, user); + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS, SUBSCRIPTION_TTL_LEDGERS); +} + +/// Shared implementation for `pay_per_use` and `pay_per_use_to`. `recipient` +/// is `None` for `pay_per_use` (defaults to `sub.merchant`, matching its +/// existing behavior exactly) and `Some(addr)` for `pay_per_use_to`. +fn pay_per_use_inner(env: &Env, user: Address, amount: i128, recipient: Option
) { + ensure_contract_not_paused(env); + user.require_auth(); + + if amount <= 0 { + env.panic_with_error(ContractError::AmountMustBePositive); + } + if amount > MAX_AMOUNT { + env.panic_with_error(ContractError::AmountExceedsMaximum); + } + + let key = DataKey::Subscription(user.clone()); + + let sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if sub.paused { + env.panic_with_error(ContractError::SubscriptionPaused); + } + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + // Only the explicit `pay_per_use_to` path re-validates the whitelist; + // `pay_per_use` (recipient == None) keeps its existing behavior of not + // re-checking a merchant that was already whitelisted at subscribe time. + let is_pay_per_use_to = recipient.is_some(); + let recipient = recipient.unwrap_or_else(|| sub.merchant.clone()); + + if is_pay_per_use_to { + if recipient == env.current_contract_address() { + env.panic_with_error(ContractError::InvalidRecipient); + } + if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &recipient) { + env.panic_with_error(ContractError::MerchantNotWhitelisted); + } + } + + spending_limit::enforce_limit(env, &user, amount); + + let fee_amount = fee::transfer_pay_per_use(env, &user, &sub.token, amount, &recipient); + let net_amount = amount - fee_amount; + + check_and_update_global_volume(env, amount); + merchant_stats::increment_revenue_with_daily(env, &recipient, net_amount); + spending_limit::record_spend(env, &user, amount); + extend_subscription_ttl(env, &user); + + events::publish_pay_per_use(env, &user, &recipient, amount); +} + +fn subscribe_inner( + env: &Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, +) { + bump_instance_ttl(env); + validation::require_valid_subscribe_addresses(env, &user, &merchant); + user.require_auth(); + + if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &merchant) { + env.panic_with_error(ContractError::MerchantNotWhitelisted); + } + + if whitelist::is_frozen(env, &merchant) { + env.panic_with_error(ContractError::MerchantFrozen); + } + + // Prevent new subscriptions when contract is paused + let paused = env + .storage() + .instance() + .get::<_, bool>(&DataKey::ContractPaused) + .unwrap_or(false); + if paused { + env.panic_with_error(ContractError::ContractPausedError); + } + + validation::require_valid_amount(env, amount); + validation::validate_interval(env, interval); + + use soroban_sdk::xdr::ToXdr; + if token.clone().to_xdr(env).get(7) == Some(0) { + env.panic_with_error(ContractError::InvalidTokenAddress); + } + + validation::check_allowance(env, &user, &token, amount); + + let now = env.ledger().timestamp(); + let trial_duration = trial_period.unwrap_or(0); + let last_charged = now + trial_duration; + + let existing = storage::get_subscription(env, &user); + let should_increment = existing.as_ref().is_none_or(|s| !s.active); + + if let Some(ref existing_sub) = existing { + if existing_sub.active && existing_sub.merchant != merchant { + merchant_stats::decrement_subscriber_count(env, &existing_sub.merchant); + } + } + + let sub = Subscription { + merchant, + amount, + interval, + last_charged, + active: true, + paused: false, + token, + referrer: referrer.clone(), + label: Symbol::new(env, ""), + trial_duration, + created_at: env.ledger().timestamp(), + }; + + env.storage() + .persistent() + .set(&DataKey::Subscription(user.clone()), &sub); + + extend_subscription_ttl(env, &user); + + if should_increment { + subscription_count::increment(env); + subscription_count::append_subscriber_index(env, &user); + } + referral::store_referral(env, &user, &referrer); + merchant_stats::increment_subscriber_count(env, &sub.merchant); + events::publish_subscribed(env, &user, &sub); +} + +pub(crate) fn check_and_update_global_volume(env: &Env, amount: i128) { + let now = env.ledger().timestamp(); + let mut window: GlobalVolumeWindow = env + .storage() + .instance() + .get(&DataKey::GlobalVolumeWindow) + .unwrap_or(GlobalVolumeWindow { + current_window_start: now, + accumulated_volume: 0, + }); + + // Checked: a window start near u64::MAX must not wrap the rollover test + // into an accidental (or permanently suppressed) window reset. + let window_end = window + .current_window_start + .checked_add(HOUR_IN_SECONDS) + .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); + + if now >= window_end { + window.current_window_start = now; + window.accumulated_volume = 0; + } + + // Overflow and cap breach are distinct failure modes: an accumulator that + // cannot represent the sum is a typed `ArithmeticOverflow`, not a policy + // rejection, so clients can tell "the protocol is at its hourly cap" from + // "this amount is not representable". + let new_volume = window + .accumulated_volume + .checked_add(amount) + .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); + + if new_volume > GLOBAL_MAX_VOLUME_PER_HOUR { + env.panic_with_error(ContractError::GlobalVolumeExceeded); + } + + window.accumulated_volume = new_volume; + env.storage() + .instance() + .set(&DataKey::GlobalVolumeWindow, &window); +} + +fn is_contract_paused(env: &Env) -> bool { + env.storage() + .instance() + .get(&DataKey::ContractPaused) + .unwrap_or(false) +} + +fn ensure_contract_not_paused(env: &Env) { + if is_contract_paused(env) { + env.panic_with_error(ContractError::ContractPaused); + } +} +#![no_std] +#![allow(clippy::too_many_arguments, clippy::inconsistent_digit_grouping)] + +#[cfg(test)] +extern crate std; + +mod admin; +mod batch; +#[cfg(feature = "bench")] +mod bench; +mod charge_exec; +mod errors; +mod events; +mod fee; +mod grace; +mod merchant_stats; +mod migration; +mod min_interval; +mod referral; +mod spending_limit; +mod storage; +mod subscription_count; +mod subscription_history; +mod subscription_metadata; +mod test; +mod test_migration; +mod trial; +mod upgrade; +mod validation; +mod whitelist; + +use crate::errors::ContractError; +use soroban_sdk::{ + contract, contractimpl, contracttype, token, Address, BytesN, Env, String, Symbol, Vec, +}; + +pub use batch::ChargeResult; +pub use batch::CancelResult; +pub use charge_exec::ChargeSimResult; +pub use charge_exec::PayPerUseSimResult; + +// ───────────────────────────────────────────────────────────── +// Storage keys +// ───────────────────────────────────────────────────────────── + +#[contracttype] +#[derive(Clone)] +pub enum DataKey { + Subscription(Address), + Token, + // Admin + Admin, + // Grace period + GracePeriod, + // Merchant whitelist + MerchantWhitelist(Address), + WhitelistEnabled, + WhitelistIndex(u32), + WhitelistIndexSize, + // Merchant freeze: blocks new subscriptions, independent of whitelist status + MerchantFrozen(Address), + MerchantFreezeReason(Address), + // Protocol fee + FeeCollector, + FeeBps, + // Feature: subscription count + ActiveCount, + // Feature: merchant revenue stats + MerchantRevenue(Address), + // Per-day merchant revenue buckets (keyed by Unix day) + MerchantRevenueDay(Address, u64), + // Index of which days have revenue buckets for a merchant + MerchantRevenueDayIndex(Address), + // Feature: daily spending limits (temporary storage) + DailyLimit(Address), + DailySpent(Address), + DayStart(Address), + // Feature: referral tracking + Referral(Address), + // Feature: state migration + SchemaVersion, + // Feature: subscription metadata labels + SubscriptionMeta(Address), + // Feature: charge history + ChargeHistory(Address), + // Feature: global volume cap + GlobalVolumeWindow, + // Feature: batch size limit override + MaxBatchSize, + // Feature: contract pause + ContractPaused, + // Feature: minimum subscription interval floor + MinInterval, + // Feature: consolidated merchant revenue history (Vec) + MerchantRevenueHistory(Address), + // Feature: subscriber index (append-only log) + SubscriberIndex(u64), + SubscriberIndexSize, + // Reverse lookup of a subscriber's slot, used to prune on cancel + SubscriberIndexSlot(Address), + // Tombstone marking a pruned (cancelled) subscriber index slot + SubscriberIndexRemoved(u64), + // Feature: per-merchant subscriber count + MerchantSubCount(Address), + // Feature: merchant index for governance/ranking + MerchantIndex(u32), + MerchantIndexSize, + MerchantKnown(Address), + // Pending admin for two-step transfer + PendingAdmin, + // Two-step auth for protocol fee + PendingFee, + // Per-merchant custom fee recipient (merchant -> destination) + MerchantFeeRecipient(Address), + // Two-step auth for grace period + PendingGracePeriod, + // Two-step auth for upgrade + PendingUpgrade, + // Feature: pause expiry (bounded pause with auto-resume) + PauseExpiry(Address), + // Feature: cumulative protocol fees collected across all merchants + TotalProtocolFees, + // Feature: configurable global hourly volume cap override + GlobalVolumeCapOverride, + // Feature: configurable min/max fee bps bounds + MinFeeBps, + MaxFeeBps, + // Feature: configurable whitelist batch size limit override + MaxWhitelistBatchSize, +} + +// ───────────────────────────────────────────────────────────── +// Constants +// ───────────────────────────────────────────────────────────── + +pub const SUBSCRIPTION_TTL_LEDGERS: u32 = 6307200; // ~1 year (assuming 5s blocks) +pub const MAX_BATCH_PAUSE_SUBSCRIPTIONS: u32 = 25; +/// Default cap for the admin whitelist batch entrypoints. Overridable at +/// runtime via `set_max_whitelist_batch_size`, bounded by `MAX_BATCH_SIZE_CEILING`. +pub const MAX_WHITELIST_BATCH_SIZE: u32 = 50; +/// Hard ceiling shared by every admin-configurable batch limit. Configured +/// limits are never allowed above this value, so batches stay bounded even if +/// an admin key is compromised. +pub const MAX_BATCH_SIZE_CEILING: u32 = 200; +pub const GLOBAL_MAX_VOLUME_PER_HOUR: i128 = 50_000_000_000_000; // 50 trillion stroops +pub const HOUR_IN_SECONDS: u64 = 3600; +pub const MAX_AMOUNT: i128 = 100_000_000_000; +pub const MAX_SUBSCRIPTION_AMOUNT: i128 = 100_000_000_000_000; + +// ───────────────────────────────────────────────────────────── +// Data types +// ───────────────────────────────────────────────────────────── + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct Subscription { + pub merchant: Address, + pub amount: i128, + pub interval: u64, + pub last_charged: u64, + pub active: bool, + pub paused: bool, // true if paused, false otherwise + pub token: Address, // SAC token used for this subscription + pub referrer: Option
, // optional referral address + pub label: Symbol, // user-assigned label for this subscription + pub trial_duration: u64, // optional trial duration in seconds + pub created_at: u64, // timestamp of subscription creation +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct SubscriptionHealth { + pub active: bool, + pub charge_due: bool, + pub within_grace: bool, + pub has_sufficient_allowance: bool, + pub is_paused: bool, + pub trial_active: bool, + pub daily_limit_set: bool, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct DailyLimitStatus { + pub limit: Option, + pub spent: i128, + pub day_start: Option, + pub remaining: Option, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct HealthReport { + pub is_healthy: bool, + pub contract_paused: bool, + pub token_configured: bool, + pub admin_configured: bool, + /// Approximate instance TTL in ledgers. On-chain, this is a hardcoded + /// lower-bound estimate (100_000) because Soroban does not expose + /// `get_ttl()` outside test builds. Do not treat as precise. + pub instance_ttl_ledgers: u32, + pub active_subscription_count: u64, + pub schema_version: u32, + pub fee_collector_set: bool, + pub global_volume_utilization_pct: u32, + /// Number of merchants with unwithdrawn revenue > 0. + pub pending_merchant_rev_count: u32, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct GlobalVolumeWindow { + pub current_window_start: u64, + pub accumulated_volume: i128, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct ProtocolStats { + pub active_count: u64, + pub fee_bps: u32, + pub fee_collector: Option
, + pub grace_period: u64, + pub whitelist_enabled: bool, + pub schema_version: u32, + pub contract_paused: bool, +} + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct ContractConfig { + pub fee_bps: u32, + pub fee_collector: Option
, + pub grace_period: u64, + pub min_interval: u64, + pub max_batch_size: u32, + pub global_volume_cap: i128, + pub whitelist_enabled: bool, + pub paused: bool, + pub schema_version: u32, +} + +// ───────────────────────────────────────────────────────────── +// Contract +// ───────────────────────────────────────────────────────────── + +pub(crate) fn cancel_inner(env: &Env, user: &Address) -> Subscription { + let key = DataKey::Subscription(user.clone()); + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + sub.active = false; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(env, user); + + subscription_count::decrement(env); + subscription_count::remove_subscriber_index(env, user); + merchant_stats::decrement_subscriber_count(env, &sub.merchant); + referral::remove_referral(env, user); + + sub +} + +#[contract] +pub struct FlowPay; + +#[contractimpl] +impl FlowPay { + /// One-time deploy entrypoint: persists the default SAC token and the + /// contract admin. Admin must authorize this invoke. + /// + /// Deploy scripts (`scripts/deploy-pipeline.ts`, `scripts/testnet-setup.ts`) + /// depend on these invariants: + /// - arity is `initialize(token, admin)` + /// - a second call returns typed `ContractError::AlreadyInitialized` (code 1) + /// - success stores both token and admin, readable via `get_token` / `get_admin` + pub fn initialize(env: Env, token: Address, admin: Address) { + bump_instance_ttl(&env); + + if env.storage().instance().has(&DataKey::Token) { + env.panic_with_error(ContractError::AlreadyInitialized); + } + + // Authorize and persist admin before writing Token so a missing/invalid + // admin signature cannot leave a token-only (partial) initialization. + admin::initialize_admin(&env, &admin); + env.storage().instance().set(&DataKey::Token, &token); + } + + /// Permissionlessly refreshes the shared instance storage TTL. + /// + /// Keeper liveness probes may call this entrypoint during read- or + /// simulation-heavy periods. It does not require auth, inspect pause + /// state, transfer funds, or mutate protocol state. + pub fn bump_instance_ttl(env: Env) { + bump_instance_ttl(&env); + } + + pub fn get_max_batch_size(env: Env) -> u32 { + batch::get_max_batch_size(&env) + } + + pub fn set_max_batch_size(env: Env, size: u32) { + admin::require_admin(&env); + if size > MAX_BATCH_SIZE_CEILING { + env.panic_with_error(ContractError::InvalidBatchSize); + } + env.storage().instance().set(&DataKey::MaxBatchSize, &size); + } + + /// Returns the batch cap applied to the admin whitelist batch entrypoints + /// (`whitelist_batch_add`, `whitelist_batch_remove`, `get_merchant_statuses`). + /// + /// This is a **separate** knob from `get_max_batch_size`, which bounds the + /// charge batches — see the design note in `whitelist.rs`. Defaults to + /// `MAX_WHITELIST_BATCH_SIZE` (50). + pub fn get_max_whitelist_batch_size(env: Env) -> u32 { + whitelist::get_max_whitelist_batch_size(&env) + } + + /// Admin-only: overrides the whitelist batch cap. + /// + /// Panics with `InvalidBatchSize` when `size` is zero or exceeds + /// `MAX_BATCH_SIZE_CEILING` (200), so whitelist batches always stay bounded. + pub fn set_max_whitelist_batch_size(env: Env, size: u32) { + admin::require_admin(&env); + whitelist::set_max_whitelist_batch_size(&env, size); + } + + pub fn get_contract_config(env: Env) -> ContractConfig { + ContractConfig { + fee_bps: fee::get_fee_bps(&env), + fee_collector: fee::get_fee_collector(&env), + grace_period: grace::get_grace_period(&env), + min_interval: min_interval::get_min_interval(&env), + max_batch_size: batch::get_max_batch_size(&env), + global_volume_cap: GLOBAL_MAX_VOLUME_PER_HOUR, + whitelist_enabled: whitelist::is_whitelist_enabled(&env), + paused: is_contract_paused(&env), + schema_version: env + .storage() + .instance() + .get(&DataKey::SchemaVersion) + .unwrap_or(1), + } + } + + /// Dry-run estimate of a `batch_charge` call. Returns one `ChargeResult` + /// per input user using the same decision logic as the live path, but + /// **never** performs state writes, token transfers, or fee collection. + /// + /// Share one precheck with `simulate_charge`: both callers route through + /// `charge_exec::dry_run_skip_precheck` so they agree on skip/pause/grace/ + /// inactive/not-due outcomes. See the design-comment block in + /// `charge_exec.rs` at `DryRunSkipOutcome` for the full list of intentional + /// differences (return enums, allowance handling deferred to Issue 001, + /// etc.). + /// + /// Non-goals (Issue 005 scope boundaries — do NOT expand): + /// * Allowance / InsufficientAllowance redesign → Issue 001. + /// * Volume-cap precheck redesign → separate issue. + pub fn get_batch_charge_estimate(env: Env, users: Vec
) -> Vec { + if users.len() > 200 { + env.panic_with_error(ContractError::BatchTooLarge); + } + let mut results: Vec = Vec::new(&env); + + for user in users.iter() { + let key = DataKey::Subscription(user.clone()); + let sub_opt: Option = env.storage().persistent().get(&key); + + let (outcome, sub_after_precheck) = + charge_exec::dry_run_skip_precheck(&env, &user, sub_opt, true); + + let result = if let charge_exec::DryRunSkipOutcome::ProceedToAllowance = outcome { + let sub = sub_after_precheck + .expect("sub present when dry_run_precheck returns ProceedToAllowance"); + if !validation::has_sufficient_allowance(&env, &user, &sub.token, sub.amount) { + ChargeResult::AllowanceInsufficient + } else { + ChargeResult::Charged + } + } else { + outcome.into_batch_result() + }; + + results.push_back(result); + } + results + } + + /// Creates or replaces a recurring subscription for `user`. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `merchant`: Recipient that receives recurring and pay-per-use transfers. + /// - `amount`: Amount transferred per billing period. Must be greater than zero. + /// - `interval`: Billing cadence in seconds. Must be greater than zero. + /// - `token`: Stellar Asset Contract used for this subscription. + /// - `trial_period`: Optional seconds to delay the first charge. + /// - `referrer`: Optional referrer stored for the subscriber. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, the merchant whitelist rejects `merchant`, + /// `amount` or `interval` is zero, or the contract allowance is below `amount`. + /// + /// # Side Effects + /// + /// Stores the subscription, refreshes its TTL, updates active subscription + /// count and referral storage, and emits `subscribed`. + pub fn subscribe( + env: Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, + ) { + subscribe_inner( + &env, + user, + merchant, + amount, + interval, + token, + trial_period, + referrer, + ); + } + + pub fn subscribe_with_metadata( + env: Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, + label: String, + ) { + if label.len() > 64 { + env.panic_with_error(ContractError::MetadataLabelTooLong); + } + + subscribe_inner( + &env, + user.clone(), + merchant, + amount, + interval, + token, + trial_period, + referrer, + ); + + let _ = subscription_metadata::set_metadata(&env, &user, label); + } + + /// Charges the next due recurring payment for `user`. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose active subscription should be charged. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// No subscriber signature is required. The contract spends through the + /// previously granted token allowance. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists, the subscription + /// is inactive or paused, the interval has not elapsed, the grace period has + /// elapsed, or token transfer authorization/allowance is insufficient. + /// + /// # Side Effects + /// + /// Transfers `amount` from `user` to the merchant, records merchant revenue + /// and charge history, refreshes subscription TTL, updates `last_charged`, + /// and emits `charged`. + pub fn charge(env: Env, user: Address) { + bump_instance_ttl(&env); + migration::require_current_version(&env); + ensure_contract_not_paused(&env); + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + let now = env.ledger().timestamp(); + + if sub.paused { + if charge_exec::try_auto_resume(&env, &user, &mut sub, now) { + // Auto-resumed; fall through to charge immediately + } else { + env.panic_with_error(ContractError::SubscriptionPaused); + } + } else if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + let next = charge_exec::compute_next_charge_at(&sub) + .unwrap_or_else(|| env.panic_with_error(ContractError::SubscriptionPaused)); + + if now < next { + env.panic_with_error(ContractError::IntervalNotElapsed); + } + + let grace_period = grace::get_grace_period(&env); + if grace_period > 0 && now > next + grace_period { + env.panic_with_error(ContractError::GracePeriodElapsed); + } + + charge_exec::execute_charge(&env, &user, &key, &mut sub, now); + } + + pub fn extend_subscription_ttl(env: Env, user: Address) { + extend_subscription_ttl(&env, &user); + } + + /// Permissionlessly refreshes the TTL of any subscription entry. + /// Returns early (no-op) if no subscription exists for `user`. + /// No auth required — safe for keeper bots to call for dormant subscribers. + pub fn bump_subscription(env: Env, user: Address) { + extend_subscription_ttl(&env, &user); + } + + /// Bumps TTL for multiple subscription entries in a single call. + /// Returns a list of addresses whose TTLs were actually extended. + pub fn batch_extend_subscription_ttl(env: Env, users: Vec
) -> Vec
{ + batch::batch_extend_subscription_ttl(&env, users) + } + + /// Dry-run simulation of a charge call. Returns ChargeSimResult variant indicating + /// whether charge would succeed or the reason it would fail. + pub fn simulate_charge(env: Env, user: Address) -> ChargeSimResult { + charge_exec::simulate_charge(&env, user) + } + + /// Dry-run simulation of a `pay_per_use` call. Returns a PayPerUseSimResult + /// variant indicating whether the pay-per-use would succeed or the reason it + /// would fail (contract paused, invalid/inactive/paused subscription, daily + /// limit exceeded, or insufficient allowance). Performs no state writes. + pub fn simulate_pay_per_use(env: Env, user: Address, amount: i128) -> PayPerUseSimResult { + charge_exec::simulate_pay_per_use(&env, user, amount, None) + } + + /// Dry-run simulation of a `pay_per_use_to` call. Mirrors + /// `simulate_pay_per_use` but also validates the `recipient` (contract-address + /// self-reference and merchant whitelist). Performs no state writes. + pub fn simulate_pay_per_use_to( + env: Env, + user: Address, + amount: i128, + recipient: Address, + ) -> PayPerUseSimResult { + charge_exec::simulate_pay_per_use(&env, user, amount, Some(recipient)) + } + + /// Executes an immediate pay-per-use charge for an active subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `amount`: One-time amount to transfer. Must be greater than zero. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, `amount` is zero, no subscription + /// exists, the subscription is inactive or paused, the daily spending limit + /// would be exceeded, or token transfer authorization/allowance is insufficient. + /// + /// # Side Effects + /// + /// Transfers `amount` to the subscription merchant, updates merchant revenue + /// and daily spend tracking, and emits `pay_per_use`. + pub fn pay_per_use(env: Env, user: Address, amount: i128) { + bump_instance_ttl(&env); + migration::require_current_version(&env); + pay_per_use_inner(&env, user, amount, None); + } + + /// Executes an immediate pay-per-use charge for an active subscription, + /// routing payment to `recipient` instead of the subscription's merchant. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// - `amount`: One-time amount to transfer. Must be greater than zero. + /// - `recipient`: Address that receives the net payment instead of `sub.merchant`. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Same as `pay_per_use`, plus panics if the merchant whitelist is enabled + /// and `recipient` is not whitelisted. + /// + /// # Side Effects + /// + /// Transfers `amount` to `recipient`, updates `recipient`'s merchant revenue + /// and the user's daily spend tracking (shared with `pay_per_use`), and + /// emits `pay_per_use` with `recipient` in place of `sub.merchant`. + pub fn pay_per_use_to(env: Env, user: Address, amount: i128, recipient: Address) { + migration::require_current_version(&env); + pay_per_use_inner(&env, user, amount, Some(recipient)); + } + + pub fn get_day_start(env: Env, user: Address) -> Option { + spending_limit::get_day_start(&env, &user) + } + + /// Cancels `user`'s active subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists for `user`. + /// + /// # Side Effects + /// + /// Marks the subscription inactive, decrements active subscription count, and + /// emits `cancelled`. + pub fn cancel(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + cancel_inner(&env, &user); + events::publish_cancelled(&env, &user); + } + + /// Extends an active subscription's trial period (or delays next charge) + /// by adding `additional_seconds` to its `last_charged` timestamp. + /// + /// # Panics + /// - If `additional_seconds` is 0 (`IntervalMustBePositive`). + /// - If the subscription is cancelled/inactive (`SubscriptionInactive`). + /// - If the subscription is paused (`SubscriptionPaused`). + /// - If the subscription doesn't exist (`NoSubscriptionFound`). + /// - If `last_charged + additional_seconds` overflows `u64` (`ArithmeticOverflow`). + pub fn extend_trial(env: Env, user: Address, additional_seconds: u64) { + bump_instance_ttl(&env); + user.require_auth(); + trial::extend_trial(&env, &user, additional_seconds); + } + + pub fn cancel_and_refund_prorated(env: Env, user: Address, merchant: Address) { + bump_instance_ttl(&env); + user.require_auth(); + merchant.require_auth(); + + let key = DataKey::Subscription(user.clone()); + let sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + if sub.paused { + env.panic_with_error(ContractError::SubscriptionPaused); + } + if sub.merchant != merchant { + env.panic_with_error(ContractError::RefundMerchantMismatch); + } + + let now = env.ledger().timestamp(); + let elapsed = now.saturating_sub(sub.last_charged); + let remaining = sub.interval.saturating_sub(elapsed); + if sub.interval == 0 { + env.panic_with_error(ContractError::IntervalMustBePositive); + } + let refund = (sub.amount * i128::from(remaining)) / i128::from(sub.interval); + + if refund <= 0 { + env.panic_with_error(ContractError::RefundAmountMustBePositive); + } + + // Refunds are merchant-funded; no protocol escrow is used. Validate the + // source balance before the transfer so an underfunded merchant cannot + // reach an opaque SAC failure or a partial cancellation. + let token_client = token::Client::new(&env, &sub.token); + if token_client.balance(&merchant) < refund { + env.panic_with_error(ContractError::InsufficientMerchantBalance); + } + + token_client.transfer(&merchant, &user, &refund); + cancel_inner(&env, &user); + events::publish_cancelled_with_refund(&env, &user, refund); + } + + /// Pauses `user`'s subscription without cancelling it. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists or the subscription is inactive. + /// + /// # Side Effects + /// + /// Sets the subscription `paused` flag and emits `paused`. + pub fn pause(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + sub.paused = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + storage::set_pause_expiry(&env, &user, u64::MAX); + + events::publish_paused(&env, &user); + } + + /// Pauses `user`'s subscription until a specific expiry timestamp. + /// The subscription will auto-resume via `charge` or `batch_charge` + /// when the ledger timestamp reaches `expiry`. + pub fn pause_until(env: Env, user: Address, expiry: u64) { + bump_instance_ttl(&env); + user.require_auth(); + + let now = env.ledger().timestamp(); + if expiry <= now { + env.panic_with_error(ContractError::InvalidPauseExpiry); + } + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::SubscriptionNotActive); + } + + sub.paused = true; + sub.active = false; + + env.storage().persistent().set(&key, &sub); + storage::set_pause_expiry(&env, &user, expiry); + + events::publish_paused(&env, &user); + } + + /// Resumes `user`'s paused subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if no subscription exists or the subscription is inactive. + /// + /// # Side Effects + /// + /// Clears the subscription `paused` flag and emits `resumed`. + pub fn resume(env: Env, user: Address) { + bump_instance_ttl(&env); + user.require_auth(); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + // Reject cancelled subscriptions (inactive and not paused). + // pause_until sets active=false while paused=true; those must still be resumable. + if !sub.active && !sub.paused { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + // Recovery rule: if the grace window has closed the subscription is no longer + // chargeable. Resume is rejected to prevent false recoverability signals. + // The only allowed exit is cancel(); re-subscribe to restore chargeability. + // See docs/SUBSCRIBER-LIFECYCLE.md. + if grace::is_grace_lapsed(&env, &sub) { + env.panic_with_error(ContractError::ResumeGraceLapsed); + } + + sub.paused = false; + sub.active = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + storage::clear_pause_expiry(&env, &user); + + events::publish_resumed(&env, &user); + } + + /// Batch-pauses subscriptions for a list of user addresses. + /// + /// Admin-only emergency tool to freeze groups of related accounts in a + /// single transaction. The vector is capped at 25 items to stay within + /// ledger size constraints. + /// + /// # Parameters + /// + /// - `users`: List of subscriber addresses to pause. Max 25 items. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Side Effects + /// + /// For every valid active subscription, sets `paused = true`, persists the + /// update, extends the subscription TTL, and emits a `subscription_paused` + /// event. Invalid (non-existent) and already-paused entries are silently + /// skipped. The contract pause flag does **not** block this call. + pub fn batch_pause_subscriptions(env: Env, users: Vec
) { + admin::require_admin(&env); + + let max_batch: u32 = 25; + if users.len() > max_batch { + env.panic_with_error(ContractError::BatchTooLarge); + } + + for user in users.iter() { + let key = DataKey::Subscription(user.clone()); + + let sub_opt: Option = env.storage().persistent().get(&key); + if let Some(mut sub) = sub_opt { + if !sub.active || sub.paused { + if sub.paused { + extend_subscription_ttl(&env, &user); + } + continue; + } + + sub.paused = true; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + events::publish_subscription_paused(&env, &user); + } + } + } + + pub fn batch_cancel(env: Env, users: Vec
) -> Vec { + admin::require_admin(&env); + batch::batch_cancel(&env, users) + } + + /// Proposes a new admin (step 1 of two-step transfer). + /// The proposed address must call `accept_admin()` to complete the transfer. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + pub fn transfer_admin(env: Env, new_admin: Address) { + admin::transfer_admin(&env, &new_admin); + } + + /// Accepts a pending admin transfer (step 2 of two-step transfer). + /// Emits `admin_transferred` and replaces the active admin. + /// + /// # Auth + /// + /// Requires authorization from the pending (new) admin. + pub fn accept_admin(env: Env) { + admin::accept_admin(&env); + } + + /// Returns the proposed admin address awaiting `accept_admin()`, or + /// `None` if there is no pending transfer. + pub fn get_pending_admin(env: Env) -> Option
{ + admin::get_pending_admin(&env) + } + + /// Returns whether the contract is currently paused. + pub fn is_contract_paused(env: Env) -> bool { + is_contract_paused(&env) + } + + /// Returns the current admin address, or `None` if no admin has been set. + pub fn get_admin(env: Env) -> Option
{ + storage::get_admin_optional(&env) + } + + /// Returns the default token address set during `initialize()`, or `None` if not initialized. + pub fn get_token(env: Env) -> Option
{ + storage::get_token(&env) + } + + pub fn propose_upgrade(env: Env, new_wasm_hash: BytesN<32>) { + upgrade::propose_upgrade(&env, new_wasm_hash); + } + + pub fn cancel_pending_upgrade(env: Env) { + upgrade::cancel_pending_upgrade(&env); + } + + pub fn commit_upgrade(env: Env) { + upgrade::commit_upgrade(&env); + } + + /// Returns the pending WASM hash queued for the two-step upgrade flow, + /// or `None` if no upgrade has been proposed. + /// + /// # Auth + /// + /// None required — view-only read. + /// + /// # Storage + /// + /// Reads `DataKey::PendingUpgrade` from temporary storage (TTL ~24 h). + /// Returns `None` when the key has expired or was never set. + pub fn get_pending_upgrade(env: Env) -> Option> { + upgrade::get_pending_upgrade(&env) + } + + pub fn clear_fee(env: Env) { + admin::require_admin(&env); + fee::clear_fee(&env); + events::publish_fee_cleared(&env); + } + + pub fn get_fee_collector(env: Env) -> Option
{ + fee::get_fee_collector(&env) + } + + /// Returns the cumulative protocol fees collected across all merchants, + /// accumulated from every `charge()` and `pay_per_use()` call. + pub fn get_total_protocol_fees(env: Env) -> i128 { + fee::get_total_protocol_fees(&env) + } + + pub fn get_subscription(env: Env, user: Address) -> Option { + env.storage().persistent().get(&DataKey::Subscription(user)) + } + + pub fn get_subscription_age(env: Env, user: Address) -> Option { + let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; + + if sub.created_at == 0 { + return None; // sentinel for migrated/unknown subscriptions + } + + Some(env.ledger().timestamp() - sub.created_at) + } + + /// Returns the Unix timestamp of the next scheduled charge for a user. + /// + /// Returns `None` if no subscription exists, the subscription is inactive, + /// or the subscription is paused. + pub fn next_charge_at(env: Env, user: Address) -> Option { + let sub = storage::get_subscription(&env, &user)?; + charge_exec::compute_next_charge_at(&sub) + } + + /// Returns `true` when `user` has a charge due right now. + /// + /// A charge is due when: + /// - The subscription is active and not paused + /// - `now >= next_charge_at` (interval has elapsed) + /// - `now <= next_charge_at + grace_period` (still within grace window, or no grace period set) + /// + /// No auth required. + pub fn is_charge_due(env: Env, user: Address) -> bool { + let sub = match storage::get_subscription(&env, &user) { + Some(s) => s, + None => return false, + }; + let next = match charge_exec::compute_next_charge_at(&sub) { + Some(n) => n, + None => return false, + }; + let now = env.ledger().timestamp(); + if now < next { + return false; + } + let grace = grace::get_grace_period(&env); + if grace > 0 && now > next + grace { + return false; + } + true + } + + /// Returns the trial end timestamp if the user is in a trial period. + pub fn get_trial_end(env: Env, user: Address) -> Option { + trial::get_trial_end(env, user) + } + + /// Proposes a new contract-wide grace period for charges. + /// Only the contract admin can call this. + pub fn propose_grace_period(env: Env, seconds: u64) { + bump_instance_ttl(&env); + grace::propose_grace_period(&env, seconds); + } + + /// Commits a pending contract-wide grace period proposal. + /// Only the contract admin can call this. + pub fn commit_grace_period(env: Env) { + bump_instance_ttl(&env); + grace::commit_grace_period(&env); + } + + /// Returns the current grace period in seconds. Returns 0 if not set. + pub fn get_grace_period(env: Env) -> u64 { + grace::get_grace_period(&env) + } + + /// Updates the recurring charge amount for `user`'s subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose subscription amount should be adjusted. + /// - `new_amount`: Replacement amount for future charges. Must be positive + /// and must not exceed `MAX_SUBSCRIPTION_AMOUNT`. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists for `user`, + /// or `new_amount` fails amount validation. + /// + /// # Side Effects + /// + /// Overwrites the subscription's `amount` field in persistent storage, + /// refreshes its TTL, and emits `sub_amount_updated`. + pub fn set_subscription_amount(env: Env, user: Address, new_amount: i128) { + ensure_contract_not_paused(&env); + admin::require_admin(&env); + + validation::require_valid_amount(&env, new_amount); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + let old_amount = sub.amount; + sub.amount = new_amount; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + + events::publish_subscription_amount_updated(&env, &user, old_amount, new_amount); + } + + /// Updates the billing interval for `user`'s subscription. + /// + /// # Parameters + /// + /// - `user`: Subscriber whose subscription interval should be adjusted. + /// - `new_interval`: Replacement interval in seconds. Must be strictly + /// greater than zero. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics if the contract is paused, no subscription exists for `user`, + /// or `new_interval` is zero (`ContractError::IntervalTooShort`). + /// + /// # Side Effects + /// + /// Overwrites the subscription's `interval` field in persistent storage, + /// refreshes its TTL, and emits `sub_interval_updated`. The change takes + /// effect immediately: `next_charge_at` will return + /// `last_charged + new_interval` after this call. + pub fn set_subscription_interval(env: Env, user: Address, new_interval: u64) { + ensure_contract_not_paused(&env); + admin::require_admin(&env); + + let key = DataKey::Subscription(user.clone()); + + let mut sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + validation::require_valid_interval(&env, new_interval); + + let old_interval = sub.interval; + sub.interval = new_interval; + + env.storage().persistent().set(&key, &sub); + extend_subscription_ttl(&env, &user); + + events::publish_subscription_interval_updated(&env, &user, old_interval, new_interval); + } + + /// Sets the minimum allowed subscription interval in seconds. + /// Only the contract admin can call this. Panics if seconds == 0. + pub fn set_min_interval(env: Env, seconds: u64) { + if seconds == 0 { + env.panic_with_error(ContractError::IntervalMustBePositive); + } + admin::require_admin(&env); + min_interval::set_min_interval(&env, seconds); + } + + /// Returns the minimum allowed subscription interval in seconds. + /// Defaults to 3600 (1 hour) when unset. + pub fn get_min_interval(env: Env) -> u64 { + min_interval::get_min_interval(&env) + } + + /// Adds a merchant to the whitelist. + pub fn add_merchant(env: Env, merchant: Address) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::add_merchant(&env, &merchant); + } + + /// Removes a merchant from the whitelist. + pub fn remove_merchant(env: Env, merchant: Address) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::remove_merchant(&env, &merchant); + } + + /// Adds multiple merchants to the whitelist in a single call. + /// Admin-only. Duplicates are idempotent. + /// Returns the number of entries processed. + /// + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50); panics with + /// `BatchTooLarge` above it. + pub fn whitelist_batch_add(env: Env, merchants: Vec
) -> u32 { + admin::require_admin(&env); + + whitelist::require_batch_within_limit(&env, merchants.len()); + + for merchant in merchants.iter() { + whitelist::add_merchant(&env, &merchant); + } + + merchants.len() + } + + /// Removes multiple merchants from the whitelist in a single call. + /// Admin-only. Removing a non-whitelisted merchant is a no-op. + /// Returns the number of entries processed. + /// + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50); panics with + /// `BatchTooLarge` above it. + pub fn whitelist_batch_remove(env: Env, merchants: Vec
) -> u32 { + admin::require_admin(&env); + + whitelist::require_batch_within_limit(&env, merchants.len()); + + for merchant in merchants.iter() { + whitelist::remove_merchant(&env, &merchant); + } + + merchants.len() + } + + /// Enables or disables the merchant whitelist. + pub fn set_whitelist_enabled(env: Env, enabled: bool) { + bump_instance_ttl(&env); + admin::require_admin(&env); + whitelist::set_whitelist_enabled(&env, enabled); + } + + /// Returns whether the merchant whitelist is currently enabled. Defaults to true. + pub fn get_whitelist_enabled(env: Env) -> bool { + whitelist::get_whitelist_enabled(&env) + } + + /// Returns whether the merchant whitelist is currently enabled. + pub fn is_whitelist_enabled(env: Env) -> bool { + whitelist::is_whitelist_enabled(&env) + } + + /// Returns whether a merchant is whitelisted. + pub fn is_merchant_whitelisted(env: Env, merchant: Address) -> bool { + whitelist::is_whitelisted(&env, &merchant) + } + + /// Returns a paginated vector of whitelisted merchants. + pub fn get_whitelist_page(env: Env, offset: u32, limit: u32) -> Vec
{ + whitelist::get_whitelist_page(&env, offset, limit) + } + + /// Returns the total count of whitelisted merchants. + pub fn get_whitelist_size(env: Env) -> u32 { + whitelist::get_whitelist_size(&env) + } + + /// Returns the whitelist and freeze status for a batch of merchant addresses. + /// Capped at the configurable whitelist batch limit + /// (`get_max_whitelist_batch_size`, default 50) so the read path and the + /// admin write paths share one number. + pub fn get_merchant_statuses(env: Env, merchants: Vec
) -> Vec<(Address, bool, bool)> { + whitelist::require_batch_within_limit(&env, merchants.len()); + let mut result = Vec::new(&env); + for merchant in merchants.iter() { + let whitelisted = whitelist::is_whitelisted(&env, &merchant); + let frozen = whitelist::is_frozen(&env, &merchant); + result.push_back((merchant, whitelisted, frozen)); + } + result + } + + /// Returns top N merchants ranked by subscriber count in descending order. + /// `limit` is capped at 20; panics with `ContractError::BatchTooLarge` if exceeded. + pub fn get_top_merchants_by_subs(env: Env, limit: u32) -> Vec<(Address, u32)> { + merchant_stats::get_top_merchants_by_subs(&env, limit) + } + + /// Sets a custom fee recipient for a merchant. The caller must be the merchant. + /// The recipient cannot be the contract address and contract must not be paused. + pub fn set_merchant_fee_recipient(env: Env, merchant: Address, recipient: Address) { + ensure_contract_not_paused(&env); + fee::set_merchant_fee_recipient(&env, &merchant, &recipient); + } + + /// Returns the configured merchant fee recipient, or None when unset. + pub fn get_merchant_fee_recipient(env: Env, merchant: Address) -> Option
{ + fee::get_merchant_fee_recipient(&env, &merchant) + } + + /// Freezes a merchant, blocking new subscriptions while leaving existing + /// subscribers' charge and pay_per_use calls unaffected. Independent of + /// whitelist status — idempotent. + pub fn freeze_merchant(env: Env, merchant: Address, reason: Option) { + admin::require_admin(&env); + whitelist::freeze(&env, &merchant, reason); + } + + /// Unfreezes a merchant, allowing new subscriptions again. Idempotent. + pub fn unfreeze_merchant(env: Env, merchant: Address) { + admin::require_admin(&env); + whitelist::unfreeze(&env, &merchant); + } + + /// Returns the reason a merchant was frozen, if any. + pub fn get_merchant_freeze_reason(env: Env, merchant: Address) -> Option { + whitelist::get_freeze_reason(&env, &merchant) + } + + /// Extends the TTL of a specific merchant daily revenue bucket. + pub fn bump_merchant_revenue_day(env: Env, merchant: Address, day: u64) { + merchant_stats::bump_merchant_revenue_day(&env, &merchant, day); + } + + /// Prunes missing or expired daily revenue buckets safely. Admin only. + pub fn prune_merchant_revenue_days(env: Env, merchant: Address, days: Vec) { + merchant_stats::prune_merchant_revenue_days(&env, &merchant, days); + } + + /// Retrieves a specific daily revenue bucket. Returns 0 if missing. + pub fn get_merchant_revenue_day(env: Env, merchant: Address, day: u64) -> i128 { + merchant_stats::get_merchant_revenue_day(&env, &merchant, day) + } + + /// Returns paginated per-day revenue pairs for a merchant. + /// Limit is capped at 30. Returns an empty Vec if no history or out of bounds. + pub fn get_merchant_revenue_day_page( + env: Env, + merchant: Address, + offset: u32, + limit: u32, + ) -> Vec<(u64, i128)> { + merchant_stats::get_merchant_revenue_day_page(&env, &merchant, offset, limit) + } + + /// Returns whether a merchant is currently frozen. + pub fn is_merchant_frozen(env: Env, merchant: Address) -> bool { + whitelist::is_frozen(&env, &merchant) + } + + /// Returns the current protocol fee settings, or `None` if unset. + pub fn get_fee(env: Env) -> Option<(Address, u32)> { + fee::get_fee_collector(&env).map(|collector| (collector, fee::get_fee_bps(&env))) + } + + /// Proposes new protocol fee collection settings (step 1 of two-step commit). + /// Stores the proposed `(collector, bps)` in temporary storage and emits + /// `fee_proposed`. Must be followed by `commit_fee()` to take effect. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + /// + /// # Errors + /// + /// Panics if `bps > 10000` (`InvalidFeeBps`) or if `collector` is the + /// contract's own address (`InvalidFeeCollector`). + pub fn propose_fee(env: Env, collector: Address, bps: u32) { + bump_instance_ttl(&env); + admin::require_admin(&env); + fee::propose_fee(&env, collector, bps); + } + + /// Commits a pending fee proposal (step 2 of two-step commit). + /// Reads the pending `(collector, bps)` from temporary storage, applies it + /// to instance storage, removes the pending entry, and emits `fee_committed`. + /// + /// # Auth + /// + /// Requires authorization from the current admin. + /// + /// # Errors + /// + /// Panics with `NoPendingProposal` if no pending fee exists. + pub fn commit_fee(env: Env) { + bump_instance_ttl(&env); + admin::require_admin(&env); + fee::commit_fee(&env); + } + + // ───────────────────────────────────────────────────────────── + // Batch charge + // ───────────────────────────────────────────────────────────── + + /// Charges multiple subscribers in a single transaction. + /// + /// Each user is processed independently — individual failures (inactive, + /// paused, interval not elapsed, etc.) are recorded as a `ChargeResult` + /// variant and do **not** abort the batch. + pub fn batch_charge(env: Env, users: Vec
) -> Vec { + bump_instance_ttl(&env); + migration::require_current_version(&env); + ensure_contract_not_paused(&env); + batch::batch_charge(&env, users) + } + + // ───────────────────────────────────────────────────────────── + // Subscription count + // ───────────────────────────────────────────────────────────── + + /// Returns the current number of active subscriptions. + pub fn get_active_count(env: Env) -> u64 { + subscription_count::get_active_count(&env) + } + + // ───────────────────────────────────────────────────────────── + // Subscriber index + // ───────────────────────────────────────────────────────────── + + /// Returns the total number of unique subscribers ever recorded (append-only count). + pub fn get_subscriber_count(env: Env) -> u64 { + subscription_count::get_subscriber_index_size(&env) + } + + /// Returns the subscriber address at the given index slot, or `None` if + /// out of range or the slot has been pruned (cancelled subscriber). + pub fn get_subscriber_at(env: Env, index: u64) -> Option
{ + if subscription_count::is_subscriber_index_removed(&env, index) { + return None; + } + env.storage() + .persistent() + .get(&DataKey::SubscriberIndex(index)) + } + + /// Returns a page of subscriber addresses starting at `offset`, capped at 50 per call. + /// Pruned (cancelled) slots are skipped. Returns an empty Vec when + /// `offset >= count` or `limit == 0`. + pub fn get_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ + let count = subscription_count::get_subscriber_index_size(&env); + let cap: u32 = if limit > 50 { 50 } else { limit }; + let mut result = Vec::new(&env); + if offset >= count || cap == 0 { + return result; + } + let mut i = offset; + let end = offset + cap as u64; + while i < end && i < count { + if !subscription_count::is_subscriber_index_removed(&env, i) { + if let Some(addr) = env.storage().persistent().get(&DataKey::SubscriberIndex(i)) { + result.push_back(addr); + } + } + i += 1; + } + result + } + + /// Returns a list of subscriber addresses that are currently due for charging. + /// Reads from the `SubscriberIndex` starting from `offset` up to `offset + limit`. + /// Capped at 50 per call. Optionally filters out grace-lapsed subscriptions when + /// `exclude_lapsed` is `Some(true)` or `None`. + pub fn get_next_charge_batch( + env: Env, + offset: u64, + limit: u32, + exclude_lapsed: Option, + ) -> Vec
{ + if limit > 50 { + env.panic_with_error(ContractError::BatchTooLarge); + } + let size = subscription_count::get_subscriber_index_size(&env); + let mut result = Vec::new(&env); + if offset >= size || limit == 0 { + return result; + } + let exclude = exclude_lapsed.unwrap_or(true); + let mut i = offset; + let end = (offset + limit as u64).min(size); + while i < end { + if !subscription_count::is_subscriber_index_removed(&env, i) { + if let Some(addr) = env.storage().persistent().get::(&DataKey::SubscriberIndex(i)) { + if let Some(sub) = storage::get_subscription(&env, &addr) { + if let Some(next) = charge_exec::compute_next_charge_at(&sub) { + let now = env.ledger().timestamp(); + if now >= next { + let grace = grace::get_grace_period(&env); + let lapsed = grace > 0 && now > next + grace; + if !exclude || !lapsed { + result.push_back(addr); + } + } + } + } + } + } + i += 1; + } + result + } + + /// Extends the TTL of all subscriber index entries to prevent archival. + /// + /// Iterates `SubscriberIndex(0..size)` and calls `extend_ttl` on each, + /// along with `SubscriberIndexSize`, `SubscriberIndexSlot`, and + /// `SubscriberIndexRemoved` entries. Bumps TTL to `SUBSCRIPTION_TTL_LEDGERS`. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Side Effects + /// + /// Extends the TTL of every persistent subscriber index entry and emits + /// a `subscriber_index_ttl_extended` event with the total count. + pub fn extend_subscriber_index_ttl(env: Env) { + admin::require_admin(&env); + + let size = subscription_count::get_subscriber_index_size(&env); + + if size == 0 { + return; + } + + // Extend the size counter itself + env.storage().persistent().extend_ttl( + &DataKey::SubscriberIndexSize, + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + + let mut count: u64 = 0; + let mut i: u64 = 0; + while i < size { + let key = DataKey::SubscriberIndex(i); + env.storage().persistent().extend_ttl( + &key, + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + count += 1; + i += 1; + } + + events::publish_subscriber_index_ttl_extended(&env, count); + } + + /// Admin-only repair: tombstones a single stale subscriber index slot. + /// + /// Looks up the occupant of `index`, refuses if that subscriber currently + /// has an active subscription, then marks the slot removed so keepers skip + /// it. This does **not** garbage-collect the rest of the index. + /// + /// # Auth + /// + /// Requires authorization from the contract admin. + /// + /// # Errors + /// + /// Panics with `NoSubscriptionFound` if `index` is out of range, empty, or + /// already tombstoned. Panics with `CannotClearActiveSubscriber` if the + /// occupant still has an active subscription. + /// + /// # Side Effects + /// + /// Writes `SubscriberIndexRemoved(index)`, drops the reverse slot lookup + /// when it points at this index, and emits `subscriber_index_cleared`. + pub fn clear_subscriber_index_entry(env: Env, index: u64) { + admin::require_admin(&env); + let user = subscription_count::clear_subscriber_index_entry(&env, index); + events::publish_subscriber_index_cleared(&env, &user, index); + } + + // ───────────────────────────────────────────────────────────── + // Merchant revenue + // ───────────────────────────────────────────────────────────── + + /// Returns the total amount charged to a merchant's subscribers + /// (sum of all successful `charge()` and `pay_per_use()` calls). + pub fn get_merchant_revenue(env: Env, merchant: Address) -> i128 { + merchant_stats::get_merchant_revenue(&env, &merchant) + } + + /// Returns per-charge revenue entries for the merchant (up to `days` most recent). + /// Oldest -> newest. Returns an empty Vec when no history has been recorded or after clearing. + pub fn get_merchant_revenue_history(env: Env, merchant: Address, days: u32) -> Vec { + merchant_stats::get_merchant_revenue_history(&env, &merchant, days) + } + + /// Returns aggregate revenue statistics for a merchant: (total, count, min_charge, max_charge). + pub fn get_merchant_revenue_summary(env: Env, merchant: Address) -> (i128, i128, i128, i128) { + merchant_stats::get_merchant_revenue_summary(&env, &merchant) + } + + /// Returns a composite health report for a user's subscription. + pub fn get_subscription_health(env: Env, user: Address) -> SubscriptionHealth { + let sub = match storage::get_subscription(&env, &user) { + Some(s) => s, + None => { + return SubscriptionHealth { + active: false, + charge_due: false, + within_grace: false, + has_sufficient_allowance: false, + is_paused: false, + trial_active: false, + daily_limit_set: false, + } + } + }; + + let active = sub.active; + let is_paused = sub.paused; + let charge_due = Self::is_charge_due(env.clone(), user.clone()); + + let next_charge = charge_exec::compute_next_charge_at(&sub); + let now = env.ledger().timestamp(); + let grace = grace::get_grace_period(&env); + + let within_grace = if let Some(next) = next_charge { + now >= next && grace > 0 && now <= next + grace + } else { + false + }; + + let has_sufficient_allowance = + validation::has_sufficient_allowance(&env, &user, &sub.token, sub.amount); + + let trial_active = trial::get_trial_end(env.clone(), user.clone()).is_some(); + let daily_limit_set = spending_limit::get_daily_limit(&env, &user).is_some(); + + SubscriptionHealth { + active, + charge_due, + within_grace, + has_sufficient_allowance, + is_paused, + trial_active, + daily_limit_set, + } + } + + /// Clears the merchant's revenue history Vec from persistent storage. + /// Only the contract admin can call this. Idempotent — safe to call when no history exists. + /// Does not affect the cumulative revenue total. + pub fn clear_merchant_revenue_history(env: Env, merchant: Address) { + admin::require_admin(&env); + merchant_stats::clear_revenue_history(&env, &merchant); + events::publish_merchant_history_cleared(&env, &merchant); + } + + /// Returns the number of active subscribers for a given merchant. + pub fn get_merchant_subscriber_count(env: Env, merchant: Address) -> u64 { + merchant_stats::get_merchant_subscriber_count(&env, &merchant) + } + + /// Returns the number of active subscribers for a given merchant (as u32). + pub fn get_merchant_sub_count(env: Env, merchant: Address) -> u32 { + subscription_count::get_merchant_sub_count(&env, &merchant) + } + + /// Returns active subscriber counts for multiple merchants in a single call. + /// Capped at 50 merchants; panics with `BatchTooLarge` above that. + /// Returns `(addr, 0)` for merchants with no recorded count. + /// No auth required. + pub fn get_merchant_sub_counts(env: Env, merchants: Vec
) -> Vec<(Address, u32)> { + merchant_stats::get_merchant_sub_counts(&env, &merchants) + } + + /// Resets a merchant's cumulative revenue counter to zero. + /// Only the contract admin can call this. + pub fn reset_merchant_revenue(env: Env, merchant: Address) { + admin::require_admin(&env); + merchant_stats::reset_merchant_revenue(&env, &merchant); + } + + /// Withdraws the merchant's accrued revenue from the contract balance + /// to their address. + /// + /// # Parameters + /// + /// - `merchant`: The merchant address. Must authorize the call. + /// + /// # Returns + /// + /// Returns nothing. + /// + /// # Auth + /// + /// Requires authorization from `merchant`. + /// + /// # Errors + /// + /// Panics if the contract is paused, the global token is not configured, + /// or the tracked accrued balance is zero or negative + /// (`ContractError::ZeroBalanceAvailable`). + /// + /// # Side Effects + /// + /// Resets the `MerchantRevenue` counter to zero before transferring + /// (reentrancy safety), then transfers tokens from the contract account + /// to `merchant` and emits `merchant_withdrawal`. + pub fn withdraw_merchant_revenue(env: Env, merchant: Address) { + ensure_contract_not_paused(&env); + merchant.require_auth(); + + let token_addr = storage::get_token(&env) + .unwrap_or_else(|| env.panic_with_error(ContractError::NotInitialized)); + + let amount = merchant_stats::get_merchant_revenue(&env, &merchant); + if amount <= 0 { + env.panic_with_error(ContractError::ZeroBalanceAvailable); + } + + // Reset before transfer to guard against reentrancy. + merchant_stats::reset_merchant_revenue(&env, &merchant); + + let token_client = token::Client::new(&env, &token_addr); + token_client.transfer(&env.current_contract_address(), &merchant, &amount); + + events::publish_merchant_withdrawal(&env, &merchant, amount); + } + + // ───────────────────────────────────────────────────────────── + // Daily spending limits + // ───────────────────────────────────────────────────────────── + + /// Sets a daily spending cap for `pay_per_use()` for the calling user. + /// Stored in temporary storage; resets automatically after ~1 day. + pub fn set_daily_limit(env: Env, user: Address, limit: i128) { + user.require_auth(); + if limit <= 0 { + env.panic_with_error(ContractError::AmountMustBePositive); + } + spending_limit::set_daily_limit(&env, &user, limit); + events::publish_daily_limit_set(&env, &user, limit); + } + + /// Returns the daily spending limit for a user, or `None` if not set. + /// Removes the caller's daily spending cap for `pay_per_use()`. + pub fn remove_daily_limit(env: Env, user: Address) { + user.require_auth(); + spending_limit::remove_daily_limit(&env, &user); + events::publish_daily_limit_removed(&env, &user); + } + + /// Returns the current daily spending limit for the caller, or `None` if unset. + pub fn get_daily_limit(env: Env, user: Address) -> Option { + spending_limit::get_daily_limit(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + /// Returns the amount spent so far today via `pay_per_use()` for the caller. + pub fn get_daily_spent(env: Env, user: Address) -> i128 { + spending_limit::get_daily_spent(&env, &user) + } + + /// Returns a consistent snapshot of a user's daily spending window. + /// `remaining` is `None` when no limit is configured and is clamped to + /// zero when spending has reached or exceeded the configured limit. + pub fn get_daily_limit_status(env: Env, user: Address) -> DailyLimitStatus { + spending_limit::get_daily_limit_status(&env, &user) + } + + // ───────────────────────────────────────────── + // Referral tracking + // ───────────────────────────────────────────────────────────── + + /// Returns the referrer address for a given subscriber, or `None`. + pub fn get_referral(env: Env, user: Address) -> Option
{ + referral::get_referrer(&env, &user) + } + + /// Returns the referrer address for a given subscriber, or `None`. + pub fn get_referrer(env: Env, user: Address) -> Option
{ + referral::get_referrer(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + // State migration + // ───────────────────────────────────────────────────────────── + + /// Migrates contract storage to the latest schema version. + /// Safe to call multiple times — subsequent calls are no-ops. + pub fn migrate(env: Env, users: Vec
) { + migration::migrate(&env, users); + } + + /// Returns the current storage schema version. + pub fn get_schema_version(env: Env) -> u32 { + migration::get_schema_version(&env) + } + + /// Returns the schema version required before current-schema subscription + /// writes and charges are enabled. Migration is admin-driven and paginated. + pub fn require_current_schema(env: Env) { + migration::require_current_version(&env); + } + + // ───────────────────────────────────────────────────────────── + // Subscription metadata + // ───────────────────────────────────────────────────────────── + + /// Attaches a short label (e.g. plan name) to the caller's subscription. + pub fn set_metadata(env: Env, user: Address, label: String) { + user.require_auth(); + if let Err(err) = subscription_metadata::set_metadata(&env, &user, label) { + env.panic_with_error(err); + } + } + + /// Returns the metadata label for a subscriber, or `None` if not set. + pub fn get_metadata(env: Env, user: Address) -> Option { + subscription_metadata::get_metadata(&env, &user) + } + + /// Alias for `get_metadata` — returns the metadata label for a subscriber, or `None` if not set. + pub fn get_subscription_label(env: Env, user: Address) -> Option { + subscription_metadata::get_metadata(&env, &user) + } + + /// Clears the metadata label for the caller's subscription. + pub fn clear_metadata(env: Env, user: Address) { + user.require_auth(); + subscription_metadata::clear_metadata(&env, &user); + } + + // ───────────────────────────────────────────────────────────── + // Charge history + // ───────────────────────────────────────────────────────────── + + /// Returns the last (up to 12) charge timestamps for a subscriber, + /// ordered oldest → newest. + pub fn get_charge_history(env: Env, user: Address) -> Vec { + subscription_history::get_charge_history(&env, &user) + } + + /// Returns the count of stored charge timestamps for a subscriber. + pub fn get_charge_history_count(env: Env, user: Address) -> u32 { + subscription_history::get_charge_history_count(&env, &user) + } + + // ───────────────────────────────────────────────────────────── + // Protocol stats + // ───────────────────────────────────────────────────────────── + + /// Returns a snapshot of all protocol-level state in a single call. + pub fn get_protocol_stats(env: Env) -> ProtocolStats { + ProtocolStats { + active_count: subscription_count::get_active_count(&env), + fee_bps: fee::get_fee_bps(&env), + fee_collector: fee::get_fee_collector(&env), + grace_period: grace::get_grace_period(&env), + whitelist_enabled: whitelist::is_whitelist_enabled(&env), + schema_version: migration::get_schema_version(&env), + contract_paused: env + .storage() + .instance() + .get(&DataKey::ContractPaused) + .unwrap_or(false), + } + } + + // ───────────────────────────────────────────────────────────── + // Contract pause + // ───────────────────────────────────────────────────────────── + + /// Pauses the contract. Only the admin can call this. + pub fn pause_contract(env: Env) { + admin::require_admin(&env); + storage::set_contract_paused(&env, true); + events::publish_contract_paused(&env); + } + + /// Unpauses the contract. Only the admin can call this. + pub fn unpause_contract(env: Env) { + admin::require_admin(&env); + storage::set_contract_paused(&env, false); + events::publish_contract_unpaused(&env); + } + + // Admin setup + // ───────────────────────────────────────────────────────────── + + /// Bootstrap-only entrypoint that writes the contract admin when no admin + /// is configured. This is a narrower alternative to [`Self::initialize`]: + /// + /// - **`initialize(token, admin)`** atomically sets the default token *and* + /// the admin together. Use this for standard deployments via + /// `scripts/deploy-pipeline.ts` — it is the canonical full-init path. + /// - **`set_initial_admin(admin)`** sets only the admin slot. It is + /// intended for partial-recovery or segmented-deploy scenarios where the + /// token is written separately (or not at all), and admin-only governance + /// is needed before full initialization. + /// + /// In both cases the proposed admin must sign the call via + /// `require_auth()`, and a second call on an already-configured contract + /// fails with a typed `ContractError::AdminAlreadySet` (code 42) so + /// deploy scripts can detect the condition without string-parsing panics. + pub fn set_initial_admin(env: Env, admin: Address) { + admin.require_auth(); + if env.storage().instance().has(&DataKey::Admin) { + env.panic_with_error(ContractError::AlreadyInitialized); + env.panic_with_error(ContractError::AdminAlreadySet); + } + storage::set_admin(&env, &admin); + } + + // ───────────────────────────────────────────────────────────── + // Health check + // ───────────────────────────────────────────────────────────── + + /// Returns a snapshot of contract health. Safe to call at any time — no auth required, no storage writes. + pub fn contract_health_check(env: Env) -> HealthReport { + let contract_paused = storage::is_contract_paused(&env); + let token_configured = storage::get_token(&env).is_some(); + let admin_configured = storage::get_admin_optional(&env).is_some(); + let fee_collector_set = fee::get_fee_collector(&env).is_some(); + + #[cfg(any(test, feature = "testutils"))] + let instance_ttl_ledgers = { + use soroban_sdk::testutils::storage::Instance as _; + env.storage().instance().get_ttl() + }; + #[cfg(not(any(test, feature = "testutils")))] + let instance_ttl_ledgers = 100_000; // at least 1 day of TTL remaining, used as default since get_ttl is not available on-chain + + let active_subscription_count = subscription_count::get_active_count(&env); + let schema_version = migration::get_schema_version(&env); + + let window: Option = + env.storage().instance().get(&DataKey::GlobalVolumeWindow); + let accumulated_volume = window.map(|w| w.accumulated_volume).unwrap_or(0); + let cap = env + .storage() + .instance() + .get(&DataKey::GlobalVolumeCapOverride) + .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR); + + let pct = if cap > 0 { + ((accumulated_volume * 100) / cap) as u32 + } else { + 0 + }; + let global_volume_utilization_pct = if pct > 100 { 100 } else { pct }; + + let total_merchants = merchant_stats::get_merchant_index_size(&env); + let mut pending_merchant_rev_count = 0; + for i in 0..total_merchants { + if let Some(merchant) = env.storage().persistent().get(&DataKey::MerchantIndex(i)) { + if merchant_stats::get_merchant_revenue(&env, &merchant) > 0 { + pending_merchant_rev_count += 1; + } + } + } + + // Healthy when not paused, fully configured, and at least 1 day of TTL remaining (17_280 ledgers at ~5 s/ledger) + let is_healthy = !contract_paused + && token_configured + && admin_configured + && instance_ttl_ledgers > 17_280; + + HealthReport { + is_healthy, + contract_paused, + token_configured, + admin_configured, + instance_ttl_ledgers, + active_subscription_count, + schema_version, + fee_collector_set, + global_volume_utilization_pct, + pending_merchant_rev_count, + } + } + + /// Clears the charge history for a subscriber. + /// Only the contract admin can call this. + pub fn clear_charge_history(env: Env, user: Address) { + admin::require_admin(&env); + subscription_history::clear_charge_history(&env, &user); + } + + /// Admin-only: removes the ChargeHistory entry for `user` entirely. + pub fn prune_charge_history(env: Env, user: Address) { + admin::require_admin(&env); + subscription_history::prune_charge_history(&env, &user); + } + + /// Returns the current TTL (in ledgers) of the ChargeHistory entry, or 0 if absent. + pub fn get_charge_history_ttl(env: Env, user: Address) -> u32 { + subscription_history::get_charge_history_ttl(&env, &user) + } + + /// Returns a paginated slice of charge timestamps for a subscriber. + /// limit is capped at 12. If `ascending` is false, records are returned in descending order (newest first). + pub fn get_charge_history_page( + env: Env, + user: Address, + offset: u32, + limit: u32, + ascending: bool, + ) -> Vec { + subscription_history::get_charge_history_page(&env, &user, offset, limit, ascending) + } + + /// Transfers subscription ownership from `user` to `new_user`. + /// + /// # Auth + /// + /// Requires authorization from `user`. + /// + /// # Errors + /// + /// Panics if the contract is paused, no active subscription exists for + /// `user`, or `new_user` already holds an active subscription. + /// + /// # Side Effects + /// + /// Moves the subscription struct to `new_user`, removes it from `user`, + /// refreshes TTL, and emits `sub_transferred` and `subscription_transferred`. + pub fn transfer_subscription(env: Env, user: Address, new_user: Address) { + ensure_contract_not_paused(&env); + validation::require_valid_transfer_targets(&env, &user, &new_user); + user.require_auth(); + new_user.require_auth(); + + let old_key = DataKey::Subscription(user.clone()); + let new_key = DataKey::Subscription(new_user.clone()); + + let sub: Subscription = env + .storage() + .persistent() + .get(&old_key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if !sub.active { + env.panic_with_error(ContractError::NoSubscriptionFound); + } + + if let Some(existing) = env + .storage() + .persistent() + .get::(&new_key) + { + if existing.active { + env.panic_with_error(ContractError::SubscriptionAlreadyActive); + } + } + + env.storage().persistent().set(&new_key, &sub); + env.storage().persistent().remove(&old_key); + + subscription_count::transfer_subscriber_index(&env, &user, &new_user); + extend_subscription_ttl(&env, &new_user); + + events::publish_subscription_transferred(&env, &user, &new_user); + events::emit_subscription_transferred(&env, &user, &new_user, &sub); + } + + // ───────────────────────────────────────────────────────────── + // Configurable global hourly volume cap + // ───────────────────────────────────────────────────────────── + + /// Returns the currently effective global hourly volume cap (stroops). + /// Falls back to the compile-time `GLOBAL_MAX_VOLUME_PER_HOUR` default + /// when no operator override has been configured. + pub fn get_global_volume_cap(env: Env) -> i128 { + env.storage() + .instance() + .get(&DataKey::GlobalVolumeCapOverride) + .unwrap_or(GLOBAL_MAX_VOLUME_PER_HOUR) + } + + /// Returns the current global volume window as `(accumulated_volume, window_start_timestamp)`. + /// Returns `(0, 0)` if no window has been started yet. + /// No auth required. + pub fn get_global_volume_window(env: Env) -> (i128, u64) { + let window: Option = + env.storage().instance().get(&DataKey::GlobalVolumeWindow); + match window { + Some(w) => (w.accumulated_volume, w.current_window_start), + None => (0, 0), + } + } + + /// Admin-only: overrides the global hourly volume cap without requiring + /// a contract upgrade. `new_cap` must be strictly positive. + pub fn set_global_volume_cap(env: Env, new_cap: i128) { + admin::require_admin(&env); + if new_cap <= 0 { + env.panic_with_error(ContractError::InvalidVolumeCap); + } + env.storage() + .instance() + .set(&DataKey::GlobalVolumeCapOverride, &new_cap); + } + + // ───────────────────────────────────────────────────────────── + // Configurable fee bounds (governance guardrails) + // ───────────────────────────────────────────────────────────── + + /// Admin-only: configures the allowed [min_bps, max_bps] range for + /// future fee proposals, guarding against accidental fee misconfiguration + /// (e.g. an operator typo setting bps close to 10000). + pub fn set_fee_bounds(env: Env, min_bps: u32, max_bps: u32) { + admin::require_admin(&env); + if min_bps > max_bps || max_bps > 10_000 { + env.panic_with_error(ContractError::InvalidFeeBounds); + } + env.storage().instance().set(&DataKey::MinFeeBps, &min_bps); + env.storage().instance().set(&DataKey::MaxFeeBps, &max_bps); + } + + /// Returns the configured (min_bps, max_bps) fee bounds, defaulting to + /// (0, 10000) when governance has not configured explicit bounds. + pub fn get_fee_bounds(env: Env) -> (u32, u32) { + let min_bps = env + .storage() + .instance() + .get(&DataKey::MinFeeBps) + .unwrap_or(0u32); + let max_bps = env + .storage() + .instance() + .get(&DataKey::MaxFeeBps) + .unwrap_or(10_000u32); + (min_bps, max_bps) + } + + // ───────────────────────────────────────────────────────────── + // Lightweight subscription reads + // ───────────────────────────────────────────────────────────── + + /// Returns the token address for a user's subscription without decoding + /// the full `Subscription` struct. + /// + /// Returns `Some(token)` when any subscription record exists for `user` + /// (including inactive/cancelled ones), and `None` when the user has never + /// subscribed. + /// + /// No auth required (view-only). + pub fn get_subscription_token(env: Env, user: Address) -> Option
{ + let sub: Subscription = env.storage().persistent().get(&DataKey::Subscription(user))?; + Some(sub.token) + } + + /// Returns just the merchant address for a user's subscription, without + /// decoding the full `Subscription` struct. Lighter-weight than + /// `get_subscription` for callers that only need to know which merchant + /// a user subscribes to. + pub fn get_subscriber_merchant(env: Env, user: Address) -> Option
{ + let sub: Subscription = env + .storage() + .persistent() + .get(&DataKey::Subscription(user))?; + Some(sub.merchant) + } + + /// Returns a page of subscriber addresses starting at `offset`, capped + /// at 50 per call, filtered to only those whose subscription is + /// currently active. Avoids forcing callers to over-fetch via + /// `get_subscriber_page` and filter client-side. + pub fn get_active_subscriber_page(env: Env, offset: u64, limit: u32) -> Vec
{ + let count = subscription_count::get_subscriber_index_size(&env); + let cap: u32 = if limit > 50 { 50 } else { limit }; + let mut result = Vec::new(&env); + if offset >= count || cap == 0 { + return result; + } + let mut i = offset; + while i < count && result.len() < cap { + if let Some(addr) = env + .storage() + .persistent() + .get::(&DataKey::SubscriberIndex(i)) + { + if let Some(sub) = env + .storage() + .persistent() + .get::(&DataKey::Subscription(addr.clone())) + { + if sub.active { + result.push_back(addr); + } + } + } + i += 1; + } + result + } +} + +#[contractimpl] +#[cfg(test)] +impl FlowPay { + /// Upgrades the current contract WASM to `new_wasm_hash` (test only). + pub fn upgrade(env: Env, new_wasm_hash: BytesN<32>) { + upgrade::upgrade(&env, new_wasm_hash); + } +} + +/// Refreshes the contract instance's TTL. Instance storage holds shared +/// protocol state (Admin, Token, FeeCollector, FeeBps, GracePeriod, +/// WhitelistEnabled, SchemaVersion, ActiveCount, ...) which all share one +/// TTL — if it lapses from prolonged inactivity, the contract is bricked. +/// Called at the start of every state-mutating public function so any +/// active use continuously keeps the instance alive without a keeper. +fn bump_instance_ttl(env: &Env) { + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS / 2, SUBSCRIPTION_TTL_LEDGERS); +} + +fn extend_subscription_ttl(env: &Env, user: &Address) { + storage::extend_subscription_ttl(env, user); + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS, SUBSCRIPTION_TTL_LEDGERS); +} + +/// Shared implementation for `pay_per_use` and `pay_per_use_to`. `recipient` +/// is `None` for `pay_per_use` (defaults to `sub.merchant`, matching its +/// existing behavior exactly) and `Some(addr)` for `pay_per_use_to`. +fn pay_per_use_inner(env: &Env, user: Address, amount: i128, recipient: Option
) { + ensure_contract_not_paused(env); + user.require_auth(); + + if amount <= 0 { + env.panic_with_error(ContractError::AmountMustBePositive); + } + if amount > MAX_AMOUNT { + env.panic_with_error(ContractError::AmountExceedsMaximum); + } + + let key = DataKey::Subscription(user.clone()); + + let sub: Subscription = env + .storage() + .persistent() + .get(&key) + .unwrap_or_else(|| env.panic_with_error(ContractError::NoSubscriptionFound)); + + if sub.paused { + env.panic_with_error(ContractError::SubscriptionPaused); + } + if !sub.active { + env.panic_with_error(ContractError::SubscriptionInactive); + } + + // Only the explicit `pay_per_use_to` path re-validates the whitelist; + // `pay_per_use` (recipient == None) keeps its existing behavior of not + // re-checking a merchant that was already whitelisted at subscribe time. + let is_pay_per_use_to = recipient.is_some(); + let recipient = recipient.unwrap_or_else(|| sub.merchant.clone()); + + if is_pay_per_use_to { + if recipient == env.current_contract_address() { + env.panic_with_error(ContractError::InvalidRecipient); + } + if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &recipient) { + env.panic_with_error(ContractError::MerchantNotWhitelisted); + } + } + + spending_limit::enforce_limit(env, &user, amount); + + let fee_amount = fee::transfer_pay_per_use(env, &user, &sub.token, amount, &recipient); + let net_amount = amount - fee_amount; + + check_and_update_global_volume(env, amount); + merchant_stats::increment_revenue_with_daily(env, &recipient, net_amount); + spending_limit::record_spend(env, &user, amount); + extend_subscription_ttl(env, &user); + + events::publish_pay_per_use(env, &user, &recipient, amount); +} + +fn subscribe_inner( + env: &Env, + user: Address, + merchant: Address, + amount: i128, + interval: u64, + token: Address, + trial_period: Option, + referrer: Option
, +) { + bump_instance_ttl(env); + // Invariant: refuse new subscription writes when the storage schema has not + // been fully migrated to the current version. After a WASM upgrade, the + // operator must call `migrate` (paged) for all existing subscribers before + // new blobs can be written, preventing mixed v1/v2/v3 storage states. + migration::require_current_version(env); + migration::require_current_version(env); + validation::require_valid_subscribe_addresses(env, &user, &merchant); + user.require_auth(); + + if whitelist::is_whitelist_enabled(env) && !whitelist::is_whitelisted(env, &merchant) { + env.panic_with_error(ContractError::MerchantNotWhitelisted); + } + + if whitelist::is_frozen(env, &merchant) { + env.panic_with_error(ContractError::MerchantFrozen); + } + + // Prevent new subscriptions when contract is paused + let paused = env + .storage() + .instance() + .get::<_, bool>(&DataKey::ContractPaused) + .unwrap_or(false); + if paused { + env.panic_with_error(ContractError::ContractPaused); + } + + validation::require_valid_amount(env, amount); + validation::validate_interval(env, interval); + + use soroban_sdk::xdr::ToXdr; + if token.clone().to_xdr(env).get(7) == Some(0) { + env.panic_with_error(ContractError::InvalidTokenAddress); + } + + validation::check_allowance(env, &user, &token, amount); + + let now = env.ledger().timestamp(); + let trial_duration = trial_period.unwrap_or(0); + let last_charged = now + trial_duration; + + let existing = storage::get_subscription(env, &user); + let should_increment = existing.as_ref().is_none_or(|s| !s.active); + + if let Some(ref existing_sub) = existing { + if existing_sub.active && existing_sub.merchant != merchant { + merchant_stats::decrement_subscriber_count(env, &existing_sub.merchant); + } + } + + let sub = Subscription { + merchant, + amount, + interval, + last_charged, + active: true, + paused: false, + token, + referrer: referrer.clone(), + label: Symbol::new(env, ""), + trial_duration, + created_at: env.ledger().timestamp(), + }; + + env.storage() + .persistent() + .set(&DataKey::Subscription(user.clone()), &sub); + + extend_subscription_ttl(env, &user); + + if should_increment { + subscription_count::increment(env); + subscription_count::append_subscriber_index(env, &user); + } + referral::store_referral(env, &user, &referrer); + merchant_stats::increment_subscriber_count(env, &sub.merchant); + events::publish_subscribed(env, &user, &sub); +} + +pub(crate) fn check_and_update_global_volume(env: &Env, amount: i128) { + let now = env.ledger().timestamp(); + let mut window: GlobalVolumeWindow = env + .storage() + .instance() + .get(&DataKey::GlobalVolumeWindow) + .unwrap_or(GlobalVolumeWindow { + current_window_start: now, + accumulated_volume: 0, + }); + + // Checked: a window start near u64::MAX must not wrap the rollover test + // into an accidental (or permanently suppressed) window reset. + let window_end = window + .current_window_start + .checked_add(HOUR_IN_SECONDS) + .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); + + if now >= window_end { + window.current_window_start = now; + window.accumulated_volume = 0; + } + + // Overflow and cap breach are distinct failure modes: an accumulator that + // cannot represent the sum is a typed `ArithmeticOverflow`, not a policy + // rejection, so clients can tell "the protocol is at its hourly cap" from + // "this amount is not representable". + let new_volume = window + .accumulated_volume + .checked_add(amount) + .unwrap_or_else(|| env.panic_with_error(ContractError::ArithmeticOverflow)); + + if new_volume > GLOBAL_MAX_VOLUME_PER_HOUR { + env.panic_with_error(ContractError::GlobalVolumeExceeded); + } + + window.accumulated_volume = new_volume; + env.storage() + .instance() + .set(&DataKey::GlobalVolumeWindow, &window); +} + +fn is_contract_paused(env: &Env) -> bool { + env.storage() + .instance() + .get(&DataKey::ContractPaused) + .unwrap_or(false) +} + +fn ensure_contract_not_paused(env: &Env) { + if is_contract_paused(env) { + env.panic_with_error(ContractError::ContractPaused); + } +} + diff --git a/contract/src/test.rs b/contract/src/test.rs index 29f9342..2a5b88c 100644 --- a/contract/src/test.rs +++ b/contract/src/test.rs @@ -1,23963 +1,36076 @@ -![cfg(test)] -#![allow( - clippy::bool_assert_comparison, - unused_variables, - dead_code, - clippy::inconsistent_digit_grouping -)] - -use super::*; -use soroban_sdk::{ - testutils::{Address as _, Events as _, Ledger}, - token::{Client as TokenClient, StellarAssetClient}, - Address, BytesN, Env, IntoVal, Symbol, TryFromVal, TryIntoVal, Vec, -}; - -/// Returns (env, contract_id, token_addr, user, merchant) -fn setup() -> (Env, Address, Address, Address, Address) { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION - // so that subscribe_inner's migration invariant guard is satisfied. - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &10_000_0000000, &200000); - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - (env, contract_id, token_addr, user, merchant) -} - -/// Helper: deploy second token -fn setup_second_token(env: &Env, contract_id: &Address, user: &Address) -> Address { - let token_admin = Address::generate(env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let sac = StellarAssetClient::new(env, &token_addr); - sac.mint(user, &10_000_0000000); - - let token = TokenClient::new(env, &token_addr); - token.approve(user, contract_id, &10_000_0000000, &200000); - - token_addr -} - -fn setup_funded_user(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &10_000_0000000); - - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &10_000_0000000, &200); - - user -} - -fn assert_last_event(env: &Env, topic: &str) { - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - let data_unit: () = data.try_into_val(env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(env, topic)); - assert_eq!(data_unit, ()); -} - -fn assert_last_user_event(env: &Env, topic: &str, user: &Address) { - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(env, topic)); - assert_eq!(topic_user, user.clone()); -} - -fn count_user_events(env: &Env, topic: &str, user: &Address) -> u32 { - let expected_topic = Symbol::new(env, topic); - let mut count = 0; - - for (_, topics, _) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - if topic_symbol != expected_topic { - continue; - } - - let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); - if topic_user == user.clone() { - count += 1; - } - } - - count -} - -// ───────────────────────────────────────────── -// Core functionality tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_and_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - assert_eq!(sub.token, token_addr); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let sub_after = client.get_subscription(&user).unwrap(); - assert!(sub_after.last_charged > 0); -} -#[test] -fn test_subscription_age_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - env.ledger().with_mut(|l| { - l.timestamp = 1; - }); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let elapsed: u64 = 1000; - env.ledger().with_mut(|l| { - l.timestamp += elapsed; - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, Some(elapsed)); -} - -#[test] -fn test_subscription_age_resets_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += 5000; - }); - - client.cancel(&user); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let elapsed_after_resub: u64 = 200; - env.ledger().with_mut(|l| { - l.timestamp += elapsed_after_resub; - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, Some(elapsed_after_resub)); -} - -#[test] -fn test_subscription_age_none_when_no_subscription() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let age = client.get_subscription_age(&user); - assert_eq!(age, None); -} - -#[test] -fn test_subscription_age_none_for_migrated_sentinel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Simulate a pre-existing subscription migrated with the created_at = 0 sentinel - env.as_contract(&contract_id, || { - let key = crate::DataKey::Subscription(user.clone()); - let mut sub: crate::Subscription = env.storage().persistent().get(&key).unwrap(); - sub.created_at = 0; - env.storage().persistent().set(&key, &sub); - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, None); -} - -#[test] -fn test_batch_charge_empty() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let results = client.batch_charge(&soroban_sdk::vec![&env]); - assert_eq!(results.len(), 0); -} - -/// charge() must decrease user balance and increase merchant balance by exactly the subscription amount. -#[test] -fn test_charge_exact_transfer_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let user_balance_after = token.balance(&user); - let merchant_balance_after = token.balance(&merchant); - - assert_eq!( - user_balance_before - user_balance_after, - amount, - "user balance should decrease by exactly the subscription amount" - ); - assert_eq!( - merchant_balance_after - merchant_balance_before, - amount, - "merchant balance should increase by exactly the subscription amount" - ); -} - -#[test] -fn test_charged_event_includes_ledger_sequence() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += 86401; - l.sequence_number += 7; - }); - - client.charge(&user); - - let mut seen_charge_event = false; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - if topic_symbol == Symbol::new(&env, "charged") { - let event_data: crate::events::ChargeEventData = data.try_into_val(&env).unwrap(); - assert_eq!(event_data.ledger_sequence, env.ledger().sequence()); - seen_charge_event = true; - } - } - - assert!(seen_charge_event, "expected a charged event"); -} - -#[test] -fn test_charge_applies_protocol_fee_and_records_net_revenue() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &500); - client.commit_fee(); // 5% - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let expected_net: i128 = amount - expected_fee; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&merchant), expected_net); -} - -#[test] -fn test_charge_routes_net_to_custom_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - let recipient = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &500); - client.commit_fee(); // 5% - - // merchant sets a custom recipient (directly write persistent storage for test) - env.as_contract(&contract_id, || { - env.storage() - .persistent() - .set(&DataKey::MerchantFeeRecipient(merchant.clone()), &recipient); - env.storage().persistent().extend_ttl( - &DataKey::MerchantFeeRecipient(merchant.clone()), - SUBSCRIPTION_TTL_LEDGERS, - SUBSCRIPTION_TTL_LEDGERS, - ); - }); - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let expected_net: i128 = amount - expected_fee; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let recipient_before = token.balance(&recipient); - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&recipient) - recipient_before, expected_fee); - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -// ───────────────────────────────────────────── -// CONTRACT-802: gross-allowance preflight before the two-leg fee transfer -// ───────────────────────────────────────────── - -/// Helper: installs an admin and commits `bps` with a fresh collector. -fn configure_fee(env: &Env, contract_id: &Address, bps: u32) -> Address { - let client = FlowPayClient::new(env, contract_id); - install_admin(env, contract_id); - let collector = Address::generate(env); - client.propose_fee(&collector, &bps); - client.commit_fee(); - collector -} - -/// An allowance exactly equal to the gross amount must cover BOTH transfer -/// legs (fee + net) when fee_bps > 0. -#[test] -fn test_charge_exact_gross_allowance_succeeds_with_fee() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Tighten the allowance to exactly the gross amount — not a stroop more. - token.approve(&user, &contract_id, &amount, &200000); - assert_eq!(token.allowance(&user, &contract_id), amount); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), expected_fee); - assert_eq!(token.balance(&merchant), amount - expected_fee); - // Both legs drew on the same allowance, consuming it exactly. - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -/// One stroop short of the gross amount must fail closed with the typed -/// `InsufficientAllowance` (#8) and move no funds on either leg. -#[test] -fn test_charge_allowance_below_gross_fails_closed_before_any_transfer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &(amount - 1), &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - let res = client.try_charge(&user); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); - // Neither leg ran: the fee leg alone would have fit in the allowance. - assert_eq!(token.balance(&collector), 0); - assert_eq!(token.balance(&merchant), 0); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -/// A fee that rounds down to zero still charges the full gross amount and -/// needs the full gross allowance. -#[test] -fn test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - // 1 * 500 / 10_000 == 0 — the fee leg is skipped entirely. - let amount: i128 = 1; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &amount, &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), 0); - assert_eq!(token.balance(&merchant), amount); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -/// The maximum in-bounds fee (10_000 bps == 100%) sends everything to the -/// collector and still passes the single gross preflight. -#[test] -fn test_charge_max_bps_exact_allowance_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 10_000); // 100% - - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &amount, &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), amount); - assert_eq!(token.balance(&merchant), 0); - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -/// pay_per_use runs the same two-leg pattern and the same preflight. -#[test] -fn test_pay_per_use_exact_gross_allowance_succeeds_with_fee() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - token.approve(&user, &contract_id, &amount, &200000); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&collector), expected_fee); - assert_eq!(token.balance(&merchant), amount - expected_fee); - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -#[test] -fn test_pay_per_use_allowance_below_gross_fails_closed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - let amount: i128 = 10_0000000; - token.approve(&user, &contract_id, &(amount - 1), &200000); - - let res = client.try_pay_per_use(&user, &amount); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); - assert_eq!(token.balance(&collector), 0); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -// ───────────────────────────────────────────── -// Issue #837 / Issue 042: shared allowance-requirement helper -// ───────────────────────────────────────────── - -struct AllowanceReqCase { - allowance: i128, - gross: i128, - fee_bps: u32, - expected: bool, - label: &'static str, -} - -/// Table-driven unit tests for the shared allowance helper: zero, exact, and -/// insufficient allowance, plus fee-off vs fee-on gross (never net-only). -#[test] -fn test_allowance_covers_gross_table() { - let gross: i128 = 10_000; - let fee_on_bps: u32 = 500; // 5% - let fee_on_net: i128 = gross - (gross * fee_on_bps as i128 / 10_000); // 9_500 - - let cases = [ - AllowanceReqCase { - allowance: 0, - gross, - fee_bps: 0, - expected: false, - label: "zero allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: 0, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "zero allowance, fee_bps > 0", - }, - AllowanceReqCase { - allowance: gross, - gross, - fee_bps: 0, - expected: true, - label: "exact allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross, - gross, - fee_bps: fee_on_bps, - expected: true, - label: "exact gross allowance, fee_bps > 0", - }, - AllowanceReqCase { - allowance: gross - 1, - gross, - fee_bps: 0, - expected: false, - label: "insufficient (one stroop short), fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross - 1, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "insufficient (one stroop short of gross), fee_bps > 0", - }, - AllowanceReqCase { - allowance: fee_on_net, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "fee-on net-only allowance is insufficient vs gross", - }, - AllowanceReqCase { - allowance: gross + 1, - gross, - fee_bps: 0, - expected: true, - label: "surplus allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross + 1, - gross, - fee_bps: fee_on_bps, - expected: true, - label: "surplus allowance, fee_bps > 0", - }, - ]; - - for c in cases { - assert_eq!( - validation::required_allowance(c.gross, c.fee_bps), - c.gross, - "required allowance must be gross ({})", - c.label - ); - assert_eq!( - validation::allowance_covers_gross(c.allowance, c.gross, c.fee_bps), - c.expected, - "{}", - c.label - ); - } -} - -struct SimulateAllowanceCase { - fee_bps: u32, - allowance: i128, - expected: ChargeSimResult, - label: &'static str, -} - -/// `simulate_charge` uses the shared helper: fee-off and fee-on both require -/// the gross amount, so a net-only allowance fails when fees are on. -#[test] -fn test_simulate_charge_allowance_requirement_table() { - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - let fee_on_bps: u32 = 500; - let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); - - let cases = [ - SimulateAllowanceCase { - fee_bps: 0, - allowance: 0, - expected: ChargeSimResult::InsufficientAllowance, - label: "zero allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: 0, - allowance: amount, - expected: ChargeSimResult::WouldSucceed, - label: "exact allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: 0, - allowance: amount - 1, - expected: ChargeSimResult::InsufficientAllowance, - label: "insufficient allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: 0, - expected: ChargeSimResult::InsufficientAllowance, - label: "zero allowance, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount, - expected: ChargeSimResult::WouldSucceed, - label: "exact gross allowance, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount - 1, - expected: ChargeSimResult::InsufficientAllowance, - label: "one stroop short of gross, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: fee_on_net, - expected: ChargeSimResult::InsufficientAllowance, - label: "net-only allowance, fee_bps > 0", - }, - ]; - - for c in cases { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - if c.fee_bps > 0 { - configure_fee(&env, &contract_id, c.fee_bps); - } - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - token.approve(&user, &contract_id, &c.allowance, &200000); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - assert_eq!(client.simulate_charge(&user), c.expected, "{}", c.label); - } -} - -struct SubscribeAllowanceCase { - fee_bps: u32, - allowance: i128, - expect_ok: bool, - label: &'static str, -} - -/// subscribe() validation uses the same gross-allowance helper, including -/// when protocol fees are configured (requirement is still the gross amount). -#[test] -fn test_subscribe_allowance_requirement_table() { - let amount: i128 = 10_0000000; - let fee_on_bps: u32 = 500; - let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); - - let cases = [ - SubscribeAllowanceCase { - fee_bps: 0, - allowance: 0, - expect_ok: false, - label: "zero allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: 0, - allowance: amount, - expect_ok: true, - label: "exact allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: 0, - allowance: amount - 1, - expect_ok: false, - label: "insufficient allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: 0, - expect_ok: false, - label: "zero allowance, fee_bps > 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount, - expect_ok: true, - label: "exact gross allowance, fee_bps > 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: fee_on_net, - expect_ok: false, - label: "net-only allowance, fee_bps > 0", - }, - ]; - - for c in cases { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - if c.fee_bps > 0 { - configure_fee(&env, &contract_id, c.fee_bps); - } - - token.approve(&user, &contract_id, &c.allowance, &200000); - let result = - client.try_subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - - if c.expect_ok { - assert!(result.is_ok(), "{}", c.label); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.amount, amount, "{}", c.label); - } else { - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error(8))), - "{}", - c.label - ); - assert!( - client.get_subscription(&user).is_none(), - "failed subscribe must not write storage ({})", - c.label - ); - } - } -} - -/// `has_sufficient_allowance` reads SAC allowance and never transfers. -#[test] -fn test_has_sufficient_allowance_does_not_transfer() { - let (env, contract_id, token_addr, user, _merchant) = setup(); - let token = TokenClient::new(&env, &token_addr); - let amount: i128 = 1_0000000; - let balance_before = token.balance(&user); - - env.as_contract(&contract_id, || { - assert!(validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - amount - )); - }); - - token.approve(&user, &contract_id, &0, &200000); - - env.as_contract(&contract_id, || { - assert!(!validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - amount - )); - assert!(validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - 0 - )); - }); - - assert_eq!(token.balance(&user), balance_before); -} - -// Note: setter input validation is covered in contract code; invoking it directly -// via the generated client isn't available in these tests. The storage-level -// behavior for routing is covered by the tests above. - -#[test] -fn test_charge_with_zero_fee_bps_skips_fee_transfer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &0); - client.commit_fee(); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -/// subscribe() must store all Subscription fields exactly as provided. -#[test] -fn test_subscription_struct_fields_match_input() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; // 30 days - - let subscribe_time = env.ledger().timestamp(); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - - assert_eq!(sub.merchant, merchant, "merchant should match"); - assert_eq!(sub.amount, amount, "amount should match"); - assert_eq!(sub.interval, interval, "interval should match"); - assert!(sub.active, "subscription should be active"); - assert!(!sub.paused, "subscription should not be paused"); - assert_eq!(sub.token, token_addr, "token should match"); - // last_charged is set to subscribe time when no trial period - assert_eq!( - sub.last_charged, subscribe_time, - "last_charged should be set to subscribe time" - ); -} - -// ───────────────────────────────────────────── -// Issue #194: get_trial_end() tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_trial_end_with_trial_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let now = env.ledger().timestamp(); - let trial_period: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &Some(trial_period), - &None, - ); - - assert_eq!(client.get_trial_end(&user), Some(now + trial_period)); -} - -#[test] -fn test_get_trial_end_without_trial_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert!(client.get_trial_end(&user).is_none()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #6)")] -fn test_charge_before_trial_end_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &Some(86400u64), - &None, - ); - - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_subscribe_non_whitelisted_merchant_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_whitelisted_merchant_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.add_merchant(&merchant); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant); - assert!(client.is_merchant_whitelisted(&merchant)); -} - -#[test] -fn test_is_merchant_whitelisted_returns_false_for_non_whitelisted() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - assert!(!client.is_merchant_whitelisted(&merchant)); -} - -#[test] -fn test_set_whitelist_enabled_false_allows_any_merchant() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.set_whitelist_enabled(&false); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant); -} - -#[test] -fn test_get_whitelist_enabled_defaults_to_true() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - assert!(client.get_whitelist_enabled()); -} - -#[test] -fn test_get_whitelist_enabled_toggles() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Default is true - assert!(client.get_whitelist_enabled()); - - // False after set_whitelist_enabled(false) - client.set_whitelist_enabled(&false); - assert!(!client.get_whitelist_enabled()); - - // True after re-enabling - client.set_whitelist_enabled(&true); - assert!(client.get_whitelist_enabled()); -} - -// ───────────────────────────────────────────── -// Merchant freeze tests -// ───────────────────────────────────────────── - -/// subscribe to a frozen merchant panics with ContractError::MerchantFrozen. -#[test] -#[should_panic(expected = "Error(Contract, #22)")] -fn test_subscribe_to_frozen_merchant_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.freeze_merchant(&merchant, &None); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -/// An existing subscriber can still be charged after their merchant is frozen — -/// freeze only blocks new subscriptions, not existing charge cycles. -#[test] -fn test_charge_succeeds_after_merchant_frozen() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.last_charged, interval + 1); -} - -/// pay_per_use is unaffected by merchant freeze status for an existing subscriber. -#[test] -fn test_pay_per_use_succeeds_after_merchant_frozen() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.freeze_merchant(&merchant, &None); - - client.pay_per_use(&user, &1_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 1_0000000); -} - -/// is_merchant_frozen reflects freeze/unfreeze state changes. -#[test] -fn test_is_merchant_frozen_reflects_state() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert!(!client.is_merchant_frozen(&merchant)); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - - client.unfreeze_merchant(&merchant); - assert!(!client.is_merchant_frozen(&merchant)); -} - -/// Freezing a merchant that is not whitelisted must still succeed — the two -/// states (whitelist, freeze) are independent of each other. -#[test] -fn test_freeze_merchant_independent_of_whitelist() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Merchant is not whitelisted at all, and whitelist enforcement is off. - assert!(!client.is_merchant_whitelisted(&merchant)); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - assert!(!client.is_merchant_whitelisted(&merchant)); -} - -/// freeze_merchant is idempotent — freezing an already-frozen merchant must not panic. -#[test] -fn test_freeze_merchant_idempotent() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.freeze_merchant(&merchant, &None); - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); -} - -/// unfreeze_merchant on a non-frozen merchant must not panic. -#[test] -fn test_unfreeze_merchant_non_frozen_is_noop() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.unfreeze_merchant(&merchant); - assert!(!client.is_merchant_frozen(&merchant)); -} - -/// freeze_merchant requires admin auth. -#[test] -#[should_panic] -fn test_freeze_merchant_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin configured — require_admin panics with "admin not set" - client.freeze_merchant(&merchant, &None); -} - -/// unfreeze_merchant requires admin auth. -#[test] -#[should_panic] -fn test_unfreeze_merchant_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin configured — require_admin panics with "admin not set" - client.unfreeze_merchant(&merchant); -} - -#[test] -#[should_panic] -fn test_non_admin_add_and_remove_merchant_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.add_merchant(&merchant); - client.remove_merchant(&merchant); -} - -// ───────────────────────────────────────────── -// CONTRACT-20: whitelist_batch_add / whitelist_batch_remove tests -// ───────────────────────────────────────────── - -#[test] -fn test_whitelist_batch_add_three_merchants() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m2.clone()); - merchants.push_back(m3.clone()); - - let count = client.whitelist_batch_add(&merchants); - - assert_eq!(count, 3); - assert!(client.is_merchant_whitelisted(&m1)); - assert!(client.is_merchant_whitelisted(&m2)); - assert!(client.is_merchant_whitelisted(&m3)); -} - -#[test] -fn test_whitelist_batch_remove_two_merchants() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - client.add_merchant(&m1); - client.add_merchant(&m2); - - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m2.clone()); - - let count = client.whitelist_batch_remove(&merchants); - - assert_eq!(count, 2); - assert!(!client.is_merchant_whitelisted(&m1)); - assert!(!client.is_merchant_whitelisted(&m2)); -} - -#[test] -fn test_whitelist_batch_add_duplicates_does_not_panic() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m1.clone()); - - let count = client.whitelist_batch_add(&merchants); - - assert_eq!(count, 2); - assert!(client.is_merchant_whitelisted(&m1)); -} - -#[test] -fn test_whitelist_batch_remove_non_whitelisted_is_noop() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - - let count = client.whitelist_batch_remove(&merchants); - - assert_eq!(count, 1); - assert!(!client.is_merchant_whitelisted(&m1)); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_add_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut merchants = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - merchants.push_back(Address::generate(&env)); - } - client.whitelist_batch_add(&merchants); -} - -#[test] -#[should_panic] -fn test_whitelist_batch_add_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(merchant.clone()); - client.whitelist_batch_add(&merchants); -} - -// ───────────────────────────────────────────── -// CONTRACT-803: configurable whitelist batch limit -// ───────────────────────────────────────────── - -/// Helper: installs a generated admin so admin-gated entrypoints are callable. -fn install_admin(env: &Env, contract_id: &Address) { - let admin = Address::generate(env); - env.as_contract(contract_id, || { - storage::set_admin(env, &admin); - }); -} - -/// Helper: installs an admin and returns a Vec of `n` freshly generated merchants. -fn whitelist_admin_and_merchants( - env: &Env, - contract_id: &Address, - n: u32, -) -> soroban_sdk::Vec
{ - install_admin(env, contract_id); - - let mut merchants = soroban_sdk::Vec::new(env); - for _ in 0..n { - merchants.push_back(Address::generate(env)); - } - merchants -} - -#[test] -fn test_max_whitelist_batch_size_defaults_to_50() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - assert_eq!(client.get_max_whitelist_batch_size(), 50); - // The whitelist knob is independent of the charge-batch knob. - client.set_max_batch_size(&10); - assert_eq!(client.get_max_whitelist_batch_size(), 50); - assert_eq!(client.get_max_batch_size(), 10); -} - -#[test] -fn test_set_max_whitelist_batch_size_lowers_cap() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); - - client.set_max_whitelist_batch_size(&2); - assert_eq!(client.get_max_whitelist_batch_size(), 2); - - // Exactly at the configured cap still succeeds. - assert_eq!(client.whitelist_batch_add(&merchants), 2); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_add_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.whitelist_batch_add(&merchants); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_remove_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.whitelist_batch_remove(&merchants); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_merchant_statuses_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.get_merchant_statuses(&merchants); -} - -#[test] -fn test_raised_whitelist_batch_cap_allows_more_than_default() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 51); - - // 51 entries panic under the default cap; raising the cap admits them. - client.set_max_whitelist_batch_size(&60); - assert_eq!(client.whitelist_batch_add(&merchants), 51); - assert_eq!(client.get_whitelist_size(), 51); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_whitelist_batch_size_zero_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_whitelist_batch_size(&0); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_whitelist_batch_size_above_ceiling_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_whitelist_batch_size(&(MAX_BATCH_SIZE_CEILING + 1)); -} - -#[test] -#[should_panic] -fn test_set_max_whitelist_batch_size_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - client.set_max_whitelist_batch_size(&10); -} - -#[test] -fn test_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active); -} - -#[test] -fn test_referral_cleared_on_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer)); - - client.cancel(&user); - - assert_eq!(client.get_referrer(&user), None); -} - -#[test] -#[should_panic] -fn test_charge_too_early() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.charge(&user); -} - -// ───────────────────────────────────────────── -// Multi-token + advanced features -// ───────────────────────────────────────────── - -#[test] -fn test_multi_token_independent_subscriptions() { - let (env, contract_id, token_a, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let token_b = setup_second_token(&env, &contract_id, &user_b); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, &merchant, &amount, &interval, &token_a, &None, &None, - ); - client.subscribe( - &user_b, &merchant, &amount, &interval, &token_b, &None, &None, - ); - - let sub_a = client.get_subscription(&user_a).unwrap(); - let sub_b = client.get_subscription(&user_b).unwrap(); - - assert_eq!(sub_a.token, token_a); - assert_eq!(sub_b.token, token_b); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user_a); - client.charge(&user_b); -} - -#[test] -fn test_user_can_switch_token() { - let (env, contract_id, token_a, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let token_b = setup_second_token(&env, &contract_id, &user); - let interval: u64 = 86400; - - client.subscribe( - &user, &merchant, &1_0000000, &interval, &token_a, &None, &None, - ); - client.subscribe( - &user, &merchant, &2_0000000, &interval, &token_b, &None, &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.token, token_b); - assert_eq!(sub.amount, 2_0000000); -} - -#[test] -fn test_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let token = TokenClient::new(&env, &token_addr); - let before = token.balance(&merchant); - - client.pay_per_use(&user, &5_0000000); - - assert_eq!(token.balance(&merchant), before + 5_0000000); -} - -#[test] -fn test_pay_per_use_applies_protocol_fee_and_records_net_revenue() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &250); - client.commit_fee(); // 2.5% - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 8_0000000; - let expected_fee: i128 = 200_0000; - let expected_net: i128 = amount - expected_fee; - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&merchant), expected_net); -} - -// ───────────────────────────────────────────── -// CONTRACT-23: pay_per_use_to tests -// ───────────────────────────────────────────── - -#[test] -fn test_pay_per_use_to_transfers_to_recipient_not_merchant() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 5_0000000; - let merchant_before = token.balance(&merchant); - let recipient_before = token.balance(&recipient); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&merchant), merchant_before); - assert_eq!(token.balance(&recipient) - recipient_before, amount); - assert_eq!(client.get_merchant_revenue(&recipient), amount); - assert_eq!(client.get_merchant_revenue(&merchant), 0); -} - -#[test] -fn test_pay_per_use_to_applies_protocol_fee_to_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - let recipient = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &250); - client.commit_fee(); // 2.5% - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 8_0000000; - let expected_fee: i128 = 200_0000; - let expected_net: i128 = amount - expected_fee; - let recipient_before = token.balance(&recipient); - let collector_before = token.balance(&collector); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&recipient) - recipient_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&recipient), expected_net); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_rejects_non_whitelisted_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.add_merchant(&merchant); - client.set_whitelist_enabled(&true); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let recipient = Address::generate(&env); // never whitelisted - client.pay_per_use_to(&user, &1_0000000, &recipient); -} - -#[test] -fn test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 3_0000000; - let merchant_before = token.balance(&merchant); - - client.pay_per_use_to(&user, &amount, &merchant); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(client.get_merchant_revenue(&merchant), amount); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_daily_limit_shared_with_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - - client.pay_per_use(&user, &6_0000000); - // Combined spend (6 + 6 = 12) exceeds the 10 limit, even though this - // second call routes through pay_per_use_to to a different recipient. - client.pay_per_use_to(&user, &6_0000000, &recipient); -} - -#[test] -fn test_pay_per_use_with_zero_fee_bps_transfers_full_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &0); - client.commit_fee(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 3_0000000; - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -#[test] -#[should_panic] -fn test_pay_per_use_inactive() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - client.pay_per_use(&user, &1_0000000); -} - -/// pay_per_use() must not update last_charged, confirming it is independent of the recurring billing cycle. -#[test] -fn test_pay_per_use_does_not_update_last_charged() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - let last_charged_before = sub_before.last_charged; - - // Advance ledger time so we can verify last_charged isn't simply matching the current time - env.ledger().with_mut(|l| { - l.timestamp += interval + 1000; - }); - - client.pay_per_use(&user, &5_0000000); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!( - sub_after.last_charged, last_charged_before, - "pay_per_use should not update last_charged" - ); -} - -#[test] -#[should_panic] -fn test_pay_per_use_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - client.pay_per_use(&random, &1_0000000); -} - -// ───────────────────────────────────────────── -// Edge cases -// ───────────────────────────────────────────── - -#[test] -#[should_panic] -fn test_pay_per_use_zero_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &0); -} - -#[test] -#[should_panic] -fn test_pay_per_use_exceeds_cap() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &(MAX_AMOUNT + 1)); -} - -/// initialize() still works for backward compat but is not required. -#[test] -fn test_initialize_backward_compat() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - // initialize with a default token — should not affect per-sub token - client.initialize(&token_addr, &admin); - - let token_b = setup_second_token(&env, &contract_id, &user); - client.subscribe(&user, &merchant, &1_0000000, &86400, &token_b, &None, &None); - - // Subscription uses token_b, not the initialized default - assert_eq!(client.get_subscription(&user).unwrap().token, token_b); -} - -// ── Issue #14: cancel nonexistent subscription ─────────────────────────────── - -/// cancel() must panic with "no subscription found" when called on a user with no subscription. -#[test] -#[should_panic] -fn test_cancel_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - client.cancel(&random); -} - -// ── Issue #13: get_subscription for nonexistent subscription ───────────────── - -/// get_subscription() must return None for an address with no subscription. -#[test] -fn test_get_subscription_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!( - client.get_subscription(&random).is_none(), - "get_subscription should return None for unknown address" - ); -} -// ── Issue #12: last_charged timestamp update ───────────────────────────────── - -/// charge() must update last_charged to the current ledger timestamp. -#[test] -fn test_charge_updates_last_charged() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; // 30 days - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Record the timestamp before advancing time - let subscribe_time = env.ledger().timestamp(); - - // Advance ledger time past interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1000; // advance by interval + 1000 seconds - }); - - // Record the timestamp right before charge - let charge_time = env.ledger().timestamp(); - assert!( - charge_time > subscribe_time, - "charge time should be after subscribe time" - ); - - client.charge(&user); - - let sub_after = client.get_subscription(&user).unwrap(); - // Verify last_charged is exactly equal to the charge_time - assert_eq!( - sub_after.last_charged, charge_time, - "last_charged should equal the ledger timestamp at charge time" - ); -} - -#[test] -#[should_panic] -fn test_zero_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &0, &86400, &token_addr, &None, &None); -} - -#[test] -#[should_panic] -fn test_zero_interval() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); -} - -#[test] -#[should_panic] -fn test_interval_too_short() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &59, &token_addr, &None, &None); -} - -#[test] -fn test_interval_minimum_valid() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.set_min_interval(&60u64); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.interval, 3600); -} - -// ───────────────────────────────────────────── -// Multi-user isolation -// ───────────────────────────────────────────── - -#[test] -fn test_multiple_users() { - let (env, contract_id, token_addr, user_a, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let merchant_b = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount_a: i128 = 1_0000000; - let amount_b: i128 = 2_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant_a, - &amount_a, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant_b, - &amount_b, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user_a); -} - -// ───────────────────────────────────────────── -// Cancel + charge edge cases -// ───────────────────────────────────────────── - -#[test] -#[should_panic] -fn test_charge_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - env.ledger().with_mut(|l| { - l.timestamp += 86401; - }); - - client.charge(&user); -} - -// ───────────────────────────────────────────── -// batch_charge tests -// ───────────────────────────────────────────── - -#[test] -fn test_batch_charge_charged_and_skipped() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let interval: u64 = 86400; - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Only advance past interval for user_a - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // user_b re-subscribes at the new timestamp so their interval hasn't elapsed - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); -} - -#[test] -fn test_batch_charge_ordering() { - let (env, contract_id, token_addr, user_1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_2 = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_2, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_2, &contract_id, &10_000_0000000, &200); - - let user_3 = Address::generate(&env); - // user_3 has no subscription - - let user_4 = Address::generate(&env); - sac.mint(&user_4, &10_000_0000000); - token.approve(&user_4, &contract_id, &10_000_0000000, &200); - - let interval = 86400; - - // user_1: valid, will be charged - client.subscribe( - &user_1, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // user_2: valid, will be charged - client.subscribe( - &user_2, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.subscribe( - &user_4, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) - users.push_back(user_2.clone()); - users.push_back(user_3.clone()); - users.push_back(user_4.clone()); - users.push_back(user_1.clone()); - - let results = client.batch_charge(&users); - - assert_eq!(results.len(), 4); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); - assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); -} - -#[test] -fn test_batch_charge_no_subscription() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let unknown = Address::generate(&env); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(unknown); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::NoSubscription); -} - -#[test] -#[cfg(feature = "bench")] -fn test_batch_charge_stress() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - env.budget().reset_unlimited(); - - let num_users = 50; - let mut users = soroban_sdk::Vec::new(&env); - let interval = 86400; - - for _ in 0..num_users { - let u = Address::generate(&env); - sac.mint(&u, &10_000_0000000); - token.approve(&u, &contract_id, &10_000_0000000, &200); - client.subscribe( - &u, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let results = client.batch_charge(&users); - - assert_eq!(results.len(), num_users); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } -} - -#[test] -#[cfg(feature = "bench")] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_over_default_limit_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - let u = Address::generate(&env); - users.push_back(u); - users.push_back(Address::generate(&env)); - } - - let res = client.try_batch_charge(&users); - assert!(res.is_err()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_batch_size_rejects_value_above_200() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.set_max_batch_size(&201); -} - -#[test] -#[should_panic] -fn test_non_admin_set_max_batch_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.set_auths(&[]); - client.set_max_batch_size(&10); -} - -#[test] -fn test_cancel_and_refund_prorated_transfers_expected_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp = 900; - }); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - - client.cancel_and_refund_prorated(&user, &merchant); - - assert_eq!( - token.balance(&merchant), - merchant_balance_before - 7_500_000 - ); - assert_eq!(token.balance(&user), user_balance_before + 7_500_000); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active); -} - -#[test] -fn test_cancel_and_refund_prorated_at_period_start_refunds_full_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - - client.cancel_and_refund_prorated(&user, &merchant); - - assert_eq!( - token.balance(&merchant), - merchant_balance_before - 1_0000000 - ); - assert_eq!(token.balance(&user), user_balance_before + 1_0000000); - assert!(!client.get_subscription(&user).unwrap().active); -} - -#[test] -#[should_panic(expected = "Error(Contract, #39)")] -fn test_cancel_and_refund_prorated_at_interval_end_rejects_zero_refund() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp = 3600; - }); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -#[should_panic(expected = "Error(Contract, #38)")] -fn test_cancel_and_refund_prorated_rejects_wrong_merchant() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let actual_merchant = Address::generate(&env); - - client.subscribe( - &user, - &actual_merchant, - &1_0000000, - &3600, - &_token_addr, - &None, - &None, - ); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_cancel_and_refund_prorated_missing_subscription_panics() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -fn test_cancel_and_refund_prorated_underfunded_merchant_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| l.timestamp = 1800); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - assert_eq!(token.balance(&merchant), merchant_balance_before); - assert_eq!(token.balance(&user), user_balance_before); - assert!(client.get_subscription(&user).unwrap().active); -} - -#[test] -fn test_cancel_and_refund_prorated_inactive_subscription_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - assert!(!client.get_subscription(&user).unwrap().active); -} - -#[test] -fn test_cancel_and_refund_prorated_paused_subscription_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert!(sub.paused); -} - -#[test] -fn test_batch_charge_inactive() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Inactive); -} - -/// batch_charge must return ChargeResult::Paused for a subscription that has been paused. -#[test] -fn test_batch_charge_paused() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Paused); -} - -/// Issue #201: batch_charge applies protocol fees identically to charge(). -#[test] -fn test_batch_charge_with_fee() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - let collector = Address::generate(&env); - let fee_bps: u32 = 100; // 1% - client.propose_fee(&collector, &fee_bps); - client.commit_fee(); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 10_000_000; // 1 XLM - let interval: u64 = 86400; - let expected_fee = amount * (fee_bps as i128) / 10_000; - let expected_net = amount - expected_fee; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_a_balance_before = token.balance(&user_a); - let user_b_balance_before = token.balance(&user_b); - let merchant_balance_before = token.balance(&merchant); - let collector_balance_before = token.balance(&collector); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Charged); - - assert_eq!( - user_a_balance_before - token.balance(&user_a), - amount, - "user_a debited gross amount" - ); - assert_eq!( - user_b_balance_before - token.balance(&user_b), - amount, - "user_b debited gross amount" - ); - assert_eq!( - token.balance(&merchant) - merchant_balance_before, - expected_net * 2, - "merchant receives net per user" - ); - assert_eq!( - token.balance(&collector) - collector_balance_before, - expected_fee * 2, - "collector receives fee per user" - ); -} - -#[test] -fn test_batch_charge_grace_period_elapsed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - let grace_period: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Advance ledger beyond interval + grace period - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::GracePeriodElapsed - ); -} - -// ----------------------------------------------------------------- -// Issue #794: batch_charge AllowanceInsufficient tolerance tests -// ----------------------------------------------------------------- - -/// A subscriber with zero allowance receives AllowanceInsufficient; no funds move. -#[test] -fn test_batch_charge_zero_allowance_returns_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Revoke the allowance entirely. - token.approve(&user, &contract_id, &0, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "zero allowance must produce AllowanceInsufficient" - ); - assert_eq!(token.balance(&user), user_balance_before, "user balance unchanged"); - assert_eq!(token.balance(&merchant), merchant_balance_before, "merchant balance unchanged"); -} - -/// A subscriber whose allowance is exactly the subscription amount is charged. -#[test] -fn test_batch_charge_exact_allowance_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Set allowance to exactly the gross amount. - token.approve(&user, &contract_id, &amount, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::Charged, - "exact allowance must allow the charge" - ); - assert_eq!( - token.balance(&user), - 10_000_0000000 - amount, - "user debited gross amount" - ); -} - -/// A subscriber with allowance one stroop below sub.amount is rejected. -#[test] -fn test_batch_charge_one_below_allowance_returns_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Set allowance to one stroop below gross. - token.approve(&user, &contract_id, &(amount - 1), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient - ); - assert_eq!(token.balance(&user), user_balance_before); - assert_eq!(token.balance(&merchant), merchant_balance_before); -} - -/// Mixed batch: Alice (sufficient) -> Bob (insufficient) -> Charlie (sufficient). -/// Bob's failure must not abort Alice's or Charlie's charges. -#[test] -fn test_batch_charge_mixed_allowance_does_not_abort_healthy_users() { - let (env, contract_id, token_addr, alice, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let bob = Address::generate(&env); - let charlie = Address::generate(&env); - sac.mint(&bob, &10_000_0000000); - sac.mint(&charlie, &10_000_0000000); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - for u in [&alice, &bob, &charlie] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - } - - // Bob revokes to an insufficient amount. - token.approve(&bob, &contract_id, &(amount / 2), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let alice_before = token.balance(&alice); - let bob_before = token.balance(&bob); - let charlie_before = token.balance(&charlie); - let merchant_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(alice.clone()); - users.push_back(bob.clone()); - users.push_back(charlie.clone()); - - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged, "Alice charged"); - assert_eq!( - results.get(1).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "Bob insufficient" - ); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged, "Charlie charged"); - - assert_eq!(alice_before - token.balance(&alice), amount, "Alice debited"); - assert_eq!(token.balance(&bob), bob_before, "Bob untouched"); - assert_eq!(charlie_before - token.balance(&charlie), amount, "Charlie debited"); - assert_eq!( - token.balance(&merchant) - merchant_before, - amount * 2, - "merchant received exactly 2 charges" - ); -} - -/// Multiple under-allowanced users in one batch all return AllowanceInsufficient. -#[test] -fn test_batch_charge_multiple_insufficient_allowances() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let user_b = Address::generate(&env); - sac.mint(&user_b, &10_000_0000000); - - let amount: i128 = 2_0000000; - let interval: u64 = 86400; - - for u in [&user_a, &user_b] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - token.approve(u, &contract_id, &(amount - 1), &200); - } - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let a_before = token.balance(&user_a); - let b_before = token.balance(&user_b); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(token.balance(&user_a), a_before); - assert_eq!(token.balance(&user_b), b_before); -} - -/// Healthy user before AND after an under-allowanced user both get charged. -#[test] -fn test_batch_charge_healthy_before_and_after_insufficient() { - let (env, contract_id, token_addr, healthy_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let insufficient = Address::generate(&env); - let healthy_b = Address::generate(&env); - sac.mint(&insufficient, &10_000_0000000); - sac.mint(&healthy_b, &10_000_0000000); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - for u in [&healthy_a, &insufficient, &healthy_b] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - } - - token.approve(&insufficient, &contract_id, &0, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let ha_before = token.balance(&healthy_a); - let hb_before = token.balance(&healthy_b); - let ins_before = token.balance(&insufficient); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(healthy_a.clone()); - users.push_back(insufficient.clone()); - users.push_back(healthy_b.clone()); - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged); - - assert_eq!(ha_before - token.balance(&healthy_a), amount); - assert_eq!(token.balance(&insufficient), ins_before); - assert_eq!(hb_before - token.balance(&healthy_b), amount); -} - -/// Auto-resume + insufficient allowance: subscription resumes but charge fails cleanly. -#[test] -fn test_batch_charge_auto_resume_with_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - client.pause_until(&user, &90_000); - - // Revoke allowance while paused. - token.approve(&user, &contract_id, &0, &200); - - // Advance past both the pause expiry and the charge interval. - env.ledger().set_timestamp(90_001); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "auto-resume + zero allowance must not panic" - ); - assert_eq!(token.balance(&user), user_balance_before); - assert_eq!(token.balance(&merchant), merchant_balance_before); - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert!(!sub.paused); -} - -/// get_batch_charge_estimate returns AllowanceInsufficient for an under-allowanced -/// due subscriber, mirroring the live batch behavior. -#[test] -fn test_batch_charge_estimate_reflects_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - token.approve(&user, &contract_id, &(amount - 1), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let users = soroban_sdk::vec![&env, user.clone()]; - let estimate = client.get_batch_charge_estimate(&users); - assert_eq!( - estimate.get(0).unwrap(), - crate::batch::ChargeResult::AllowanceInsufficient - ); -} - -/// Allowance check is against gross sub.amount, NOT the post-fee net amount. -/// Allowance == net (< gross) must still return AllowanceInsufficient. -#[test] -fn test_batch_charge_allowance_checked_against_gross_not_net() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let admin = Address::generate(&env); - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - crate::storage::set_admin(&env, &admin); - }); - // 10% fee: net = 90% of gross. - client.propose_fee(&collector, &1000); - client.commit_fee(); - - let gross: i128 = 1_0000000; - let net: i128 = gross - gross * 1000 / 10_000; // 9_000_000 - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &gross, &interval, &token_addr, &None, &None); - - // Set allowance to exactly the net amount -- below gross. - token.approve(&user, &contract_id, &net, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "allowance == net but < gross must still fail" - ); - assert_eq!(token.balance(&user), user_balance_before, "no funds moved"); -} - -// ───────────────────────────────────────────── -// subscription_count tests -// ───────────────────────────────────────────── - -#[test] -fn test_active_count_increments_on_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_active_count(), 0); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); -} - -#[test] -fn test_active_count_does_not_double_count_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - - client.subscribe( - &user, - &merchant_b, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant_b); - assert_eq!(sub.amount, 2_0000000); -} - -#[test] -fn test_active_count_decrements_on_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - client.cancel(&user); - assert_eq!(client.get_active_count(), 0); -} - -#[test] -fn test_active_count_multiple_users() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 2); - - client.cancel(&user_a); - assert_eq!(client.get_active_count(), 1); -} - -// ───────────────────────────────────────────── -// merchant_stats tests -// ───────────────────────────────────────────── - -#[test] -fn test_merchant_revenue_from_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_merchant_revenue(&merchant), 0); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_merchant_revenue(&merchant), amount); -} - -#[test] -fn test_merchant_revenue_from_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &3_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); -} - -#[test] -fn test_merchant_revenue_accumulates() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 2_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - client.pay_per_use(&user, &1_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); -} - -// ───────────────────────────────────────────── -// spending_limit tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_daily_limit() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Initial limit should be None - assert_eq!(client.get_daily_limit(&user), None); - - // After setting, it should return Some(limit) - client.set_daily_limit(&user, &10_0000000); - assert_eq!(client.get_daily_limit(&user), Some(10_0000000)); -} - -#[test] -fn test_get_daily_limit_status_absent_limit() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!( - client.get_daily_limit_status(&user), - DailyLimitStatus { - limit: None, - spent: 0, - day_start: None, - remaining: None, - } - ); -} - -#[test] -fn test_get_daily_limit_status_snapshot_and_rollover() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - client.pay_per_use(&user, &2_0000000); - - let status = client.get_daily_limit_status(&user); - assert_eq!(status.limit, Some(10_0000000)); - assert_eq!(status.spent, 2_0000000); - assert_eq!(status.remaining, Some(8_0000000)); - assert_eq!(status.day_start, client.get_day_start(&user)); - - env.as_contract(&contract_id, || { - env.storage().temporary().extend_ttl( - &DataKey::DailyLimit(user.clone()), - 35000, - 35000, - ); - }); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += 17281; - }); - - assert_eq!( - client.get_daily_limit_status(&user), - DailyLimitStatus { - limit: Some(10_0000000), - spent: 0, - day_start: None, - remaining: Some(10_0000000), - } - ); -} - -#[test] -fn test_daily_limit_allows_spend_within_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - // Should not panic - client.pay_per_use(&user, &5_0000000); -} - -#[test] -#[should_panic] -fn test_daily_limit_blocks_overspend() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &3_0000000); - client.pay_per_use(&user, &5_0000000); -} - -#[test] -fn test_daily_limit_accumulates_across_calls() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - client.pay_per_use(&user, &2_0000000); - client.pay_per_use(&user, &2_0000000); - // 4 total, limit is 5 — should pass -} - -#[test] -#[should_panic] -fn test_daily_limit_blocks_cumulative_overspend() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - client.pay_per_use(&user, &3_0000000); - client.pay_per_use(&user, &3_0000000); // 6 total > 5 limit -} - -#[test] -fn test_daily_limit_visibility_and_spend_tracking() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_daily_limit(&user), None); - assert_eq!(client.get_daily_spent(&user), 0); - - client.set_daily_limit(&user, &4_0000000); - assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); - - client.pay_per_use(&user, &1_0000000); - assert_eq!(client.get_daily_spent(&user), 1_0000000); - assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); -} - -#[test] -fn test_get_day_start_visibility() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // No window before any spend - assert!(client.get_day_start(&user).is_none()); - assert_eq!(client.get_daily_spent(&user), 0); - - client.set_daily_limit(&user, &10_0000000); - // Setting a limit alone does not open the day window - assert!(client.get_day_start(&user).is_none()); - - client.pay_per_use(&user, &2_0000000); - assert!(client.get_day_start(&user).is_some()); - assert_eq!(client.get_daily_spent(&user), 2_0000000); - - client.remove_daily_limit(&user); - assert!(client.get_day_start(&user).is_none()); - assert_eq!(client.get_daily_spent(&user), 0); -} - -#[test] -fn test_daily_limit_set_event_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.set_daily_limit(&user, &4_0000000); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let limit: i128 = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "daily_limit_set")); - assert_eq!(topic_user, user); - assert_eq!(limit, 4_0000000); -} - -#[test] -fn test_daily_limit_removed_event_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.set_daily_limit(&user, &4_0000000); - client.remove_daily_limit(&user); - - assert_eq!(client.get_daily_limit(&user), None); - assert_last_user_event(&env, "daily_limit_removed", &user); -} - -#[test] -fn test_remove_daily_limit_allows_pay_per_use_after_removal() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &3_0000000); - client.pay_per_use(&user, &2_0000000); - client.remove_daily_limit(&user); - client.pay_per_use(&user, &2_0000000); // should succeed after removal -} - -// ───────────────────────────────────────────── -// Contract admin event tests -// ───────────────────────────────────────────── - -#[test] -fn test_contract_pause_events_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.pause_contract(); - assert!(client.is_contract_paused()); - assert_last_event(&env, "contract_paused"); - - client.unpause_contract(); - assert!(!client.is_contract_paused()); - assert_last_event(&env, "contract_unpaused"); -} - -// ───────────────────────────────────────────── -// Migration tests -// ───────────────────────────────────────────── - -#[test] -fn test_migrate_v1_to_v2() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Manually construct and store a V1 subscription - let v1_sub = crate::migration::SubscriptionV1 { - merchant: merchant.clone(), - amount: 1_0000000, - interval: 86400, - last_charged: env.ledger().timestamp(), - active: true, - token: token_addr.clone(), - referrer: None, - label: Symbol::new(&env, "v1_label"), - trial_duration: 0, - }; - - env.as_contract(&contract_id, || { - env.storage() - .persistent() - .set(&crate::DataKey::Subscription(user.clone()), &v1_sub); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - client.migrate(&users); - - // Verify it was upgraded to V2 - let v2_sub = client.get_subscription(&user).unwrap(); - assert_eq!(v2_sub.merchant, merchant); - assert_eq!(v2_sub.amount, 1_0000000); - assert_eq!(v2_sub.active, true); - assert_eq!(v2_sub.paused, false); // This is the newly added field - assert_eq!(v2_sub.label, Symbol::new(&env, "v1_label")); -} - -#[test] -fn test_admin_batch_pause_subscriptions_freezes_multiple_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - client.batch_pause_subscriptions(&users); - - assert!(client.get_subscription(&user_a).unwrap().paused); - assert!(client.get_subscription(&user_b).unwrap().paused); - assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); - assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 1); -} - -#[test] -#[should_panic] -fn test_batch_pause_subscriptions_requires_admin_auth() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let admin = Address::generate(&env); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = Vec::new(&env); - users.push_back(user); - - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let missing_user = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user_b); - - let mut users = Vec::new(&env); - users.push_back(missing_user.clone()); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - client.batch_pause_subscriptions(&users); - - assert!(client.get_subscription(&user_a).unwrap().paused); - assert!(client.get_subscription(&user_b).unwrap().paused); - assert!(client.get_subscription(&missing_user).is_none()); - assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); - assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 0); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let mut users = Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_upgrade_event_emitted() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[7; 32]); - client.upgrade(&new_wasm_hash); - - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let mock_wasm_hash = BytesN::from_array(&env, &[0u8; 32]); - env.as_contract(&contract_id, || { - events::publish_upgraded(&env, &mock_wasm_hash); - }); - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "upgrade")); -} - -// ───────────────────────────────────────────────────────────── -// Issue #45: get_pending_upgrade tests -// ───────────────────────────────────────────────────────────── - -/// Returns None when no upgrade has been proposed. -#[test] -fn test_get_pending_upgrade_none_when_not_proposed() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - assert_eq!(client.get_pending_upgrade(), None); -} - -/// Returns the proposed WASM hash after propose_upgrade is called. -#[test] -fn test_get_pending_upgrade_returns_proposed_hash() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xAB; 32]); - client.propose_upgrade(&new_wasm_hash); - - assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); -} - -/// Returns None after commit_upgrade consumes the pending hash. -#[test] -fn test_get_pending_upgrade_none_after_commit() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xCD; 32]); - client.propose_upgrade(&new_wasm_hash); - - // Hash is visible before commit - assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); - - client.commit_upgrade(); - - // Cleared after commit - assert_eq!(client.get_pending_upgrade(), None); -} - -#[test] -fn test_cancel_pending_upgrade_clears_pending_upgrade_and_emits_event() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xEF; 32]); - client.propose_upgrade(&new_wasm_hash); - client.cancel_pending_upgrade(); - - assert_eq!(client.get_pending_upgrade(), None); - assert_last_event(&env, "upg_cancelled"); -} - -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_commit_upgrade_requires_pending_upgrade_after_cancel() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); - client.cancel_pending_upgrade(); - client.commit_upgrade(); -} - -#[test] -fn test_pending_upgrade_expires() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS + 1; - }); - - assert_eq!(client.get_pending_upgrade(), None); -} - -#[test] -fn test_repropose_refreshes_pending_upgrade_ttl() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let first_hash = BytesN::from_array(&env, &[0x01; 32]); - let second_hash = BytesN::from_array(&env, &[0x02; 32]); - client.propose_upgrade(&first_hash); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; - }); - client.propose_upgrade(&second_hash); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; - }); - - assert_eq!(client.get_pending_upgrade(), Some(second_hash)); -} - -/// A second propose_upgrade overwrites the first pending hash. -#[test] -fn test_get_pending_upgrade_overwritten_by_second_proposal() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let hash_a = BytesN::from_array(&env, &[0x01; 32]); - let hash_b = BytesN::from_array(&env, &[0x02; 32]); - - client.propose_upgrade(&hash_a); - assert_eq!(client.get_pending_upgrade(), Some(hash_a)); - - client.propose_upgrade(&hash_b); - assert_eq!(client.get_pending_upgrade(), Some(hash_b)); -} -// ───────────────────────────────────────────── -// ───────────────────────────────────────────────────────────── -// Issue #96: referral tracking tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_referral_stored_on_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - - assert_eq!(client.get_referrer(&user), Some(referrer)); -} - -#[test] -fn test_no_referral_returns_none() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert!(client.get_referrer(&user).is_none()); -} - -#[test] -fn test_referral_updates_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer_a = Address::generate(&env); - let referrer_b = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer_a.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer_a)); - - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &Some(referrer_b.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer_b)); -} - -#[test] -fn test_grace_period_ttl_extension() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Ensure an admin is set so admin checks pass. - let admin = Address::generate(&env); - // Write admin as the contract to set instance storage from the test harness. - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - // Set a grace period as admin and verify read returns the same value. - let seconds: u64 = 3600; - client.propose_grace_period(&seconds); - client.commit_grace_period(); - let got = client.get_grace_period(); - assert_eq!(got, seconds); -} - -#[test] -#[should_panic(expected = "Error(Contract, #1)")] -fn test_double_initialize() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.initialize(&token_addr, &admin); -} - -// ───────────────────────────────────────────── -// Issue #839 / Issue 044: deploy-facing initialize invariants -// Relied on by scripts/deploy-pipeline.ts and scripts/testnet-setup.ts. -// Signature must remain initialize(token, admin). Failures that scripts map -// must be ContractError (AlreadyInitialized = 1), not a host string panic. -// ───────────────────────────────────────────── - -/// Successful initialize persists both the default token and the admin. -/// Deploy health checks require `token_configured` and `admin_configured`. -#[test] -fn test_initialize_deploy_invariant_persists_token_and_admin() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - - assert_eq!( - client.get_token(), - Some(token_addr.clone()), - "initialize must persist the token readable via get_token" - ); - assert_eq!( - client.get_admin(), - Some(admin.clone()), - "initialize must persist the admin readable via get_admin" - ); - - let report = client.contract_health_check(); - assert!(report.token_configured); - assert!(report.admin_configured); -} - -/// Storage read used by deploy scripts: get_admin returns the initialized admin. -#[test] -fn test_initialize_deploy_invariant_stored_admin() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_admin().is_none()); - client.initialize(&token_addr, &admin); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// Storage read used by deploy scripts: get_token returns the initialized token. -#[test] -fn test_initialize_deploy_invariant_stored_token() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_token().is_none()); - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); -} - -/// A second initialize must return typed AlreadyInitialized (code 1), not a string panic. -#[test] -fn test_initialize_deploy_invariant_double_init_already_initialized() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - - let result = client.try_initialize(&token_addr, &admin); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AlreadyInitialized as u32 - ))), - "double initialize must map to ContractError::AlreadyInitialized" - ); - - // First initialize state is unchanged. - assert_eq!(client.get_token(), Some(token_addr)); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// Initialize without admin authorization must fail and must not persist token or admin. -#[test] -fn test_initialize_deploy_invariant_requires_admin_auth() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.set_auths(&[]); - - let result = client.try_initialize(&token_addr, &admin); - assert!(result.is_err(), "initialize without admin auth must fail"); - assert_ne!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AlreadyInitialized as u32 - ))), - "missing admin auth is an authorization failure, not AlreadyInitialized" - ); - - assert!( - client.get_token().is_none(), - "failed initialize must not persist token" - ); - assert!( - client.get_admin().is_none(), - "failed initialize must not persist admin" - ); -} - -/// Backward-compat: current initialize(token, admin) arity remains the deploy entrypoint. -#[test] -fn test_initialize_deploy_invariant_token_admin_signature() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); - assert_eq!(client.get_admin(), Some(admin)); -} - -#[test] -fn test_referral_clears_on_resubscribe_with_none() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer)); - - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - assert!(client.get_referrer(&user).is_none()); -} - -#[test] -fn test_self_referral_rejected_via_try_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(user.clone()), - ); - - assert_eq!(result, Err(Ok(soroban_sdk::Error::from_contract_error(11)))); -} - -// ───────────────────────────────────────────── -// Issue #97: migration tests -// ───────────────────────────────────────────── - -#[test] -fn test_migrate_sets_schema_version() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Before migration, version defaults to 0 - assert_eq!(client.get_schema_version(), 0); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - - assert_eq!(client.get_schema_version(), 3); -} - -#[test] -fn test_migrate_is_idempotent() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - client.migrate(&empty_users); // second call should be a no-op - - assert_eq!(client.get_schema_version(), 3); -} - -// ───────────────────────────────────────────── -#[test] -#[should_panic] -fn test_migrate_non_admin_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.migrate(&users); -} - -#[test] -fn test_migrate_emits_completed_event_with_version_and_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &2u32); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.migrate(&users); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (version, user_count): (u32, u32) = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "migration_completed")); - assert_eq!(version, 3); - assert_eq!(user_count, 1); -} - -// ───────────────────────────────────────────── -// Issue #99: subscription metadata tests -// ───────────────────────────────────────────── - -#[test] -fn test_set_and_get_metadata() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let label = soroban_sdk::String::from_str(&env, "pro"); - client.set_metadata(&user, &label); - - assert_eq!(client.get_metadata(&user), Some(label)); -} - -#[test] -fn test_clear_metadata_removes_label() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let label = soroban_sdk::String::from_str(&env, "pro"); - client.set_metadata(&user, &label); - assert_eq!(client.get_metadata(&user), Some(label)); - - client.clear_metadata(&user); - - assert!(client.get_metadata(&user).is_none()); -} - -#[test] -fn test_get_metadata_none_when_not_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!(client.get_metadata(&random).is_none()); -} - -// ───────────────────────────────────────────── -// Issue #98: charge history tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_charge_history_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. A fresh user with no subscription/no charges ever → count is 0. - let fresh_user = Address::generate(&env); - assert_eq!(client.get_charge_history_count(&fresh_user), 0); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Also checking count for user with active subscription but no charges yet - assert_eq!(client.get_charge_history_count(&user), 0); - - // 2. Count increments by 1 correctly after each individual charge event. - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - assert_eq!(client.get_charge_history_count(&user), 1); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - assert_eq!(client.get_charge_history_count(&user), 2); - - // Charge more to get exactly 12 entries - for _ in 0..10 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - // 5. (Edge case) A user with exactly 12 entries → returns exactly 12. - assert_eq!(client.get_charge_history_count(&user), 12); - - // 3. Count caps at 12 and does not exceed it even after more than 12 charges have occurred. - for _ in 0..5 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - assert_eq!(client.get_charge_history_count(&user), 12); - - // 4. After calling clear_charge_history for a user who had history, count returns to 0. - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.clear_charge_history(&user); - assert_eq!(client.get_charge_history_count(&user), 0); -} - -#[test] -fn test_charge_history_recorded() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_charge_history(&user).len(), 0); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_charge_history(&user).len(), 1); -} - -#[test] -fn test_charge_history_capped_at_12() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Perform 14 charges - for _ in 0..14 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - assert_eq!(client.get_charge_history(&user).len(), 12); -} - -#[test] -fn test_get_charge_history_three_charges_ascending() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t1 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t2 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t3 = env.ledger().timestamp(); - - let history = client.get_charge_history(&user); - assert_eq!(history.len(), 3); - assert_eq!(history.get(0).unwrap(), t1); - assert_eq!(history.get(1).unwrap(), t2); - assert_eq!(history.get(2).unwrap(), t3); -} - -#[test] -fn test_get_charge_history_page_offset_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t1 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t2 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t3 = env.ledger().timestamp(); - - let page = client.get_charge_history_page(&user, &1u32, &2u32, &true); - assert_eq!(page.len(), 2); - assert_eq!(page.get(0).unwrap(), t2); - assert_eq!(page.get(1).unwrap(), t3); -} - -#[test] -#[should_panic] -fn test_clear_charge_history_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - client.clear_charge_history(&user); -} - -#[test] -fn test_clear_charge_history_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_charge_history(&user).len(), 1); - - client.clear_charge_history(&user); - - assert_eq!(client.get_charge_history(&user).len(), 0); -} - -#[test] -fn test_get_charge_history_empty_for_no_history() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - let history = client.get_charge_history(&random); - assert_eq!(history.len(), 0); -} - -#[test] -fn test_get_charge_history_page_limit_capped_at_12() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - for _ in 0..14 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - let page = client.get_charge_history_page(&user, &0u32, &100u32, &true); - assert_eq!(page.len(), 12); -} - -#[test] -fn test_get_charge_history_page_offset_beyond_length() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - let page = client.get_charge_history_page(&user, &5u32, &2u32, &true); - assert_eq!(page.len(), 0); -} - -#[test] -fn test_charge_history_sort_ascending_and_descending() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut timestamps = Vec::new(&env); - for _ in 0..5 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - timestamps.push_back(env.ledger().timestamp()); - } - - let t0 = timestamps.get(0).unwrap(); - let t1 = timestamps.get(1).unwrap(); - let t2 = timestamps.get(2).unwrap(); - let t3 = timestamps.get(3).unwrap(); - let t4 = timestamps.get(4).unwrap(); - - // Ascending (true) full page: [t0, t1, t2, t3, t4] - let asc_all = client.get_charge_history_page(&user, &0u32, &10u32, &true); - assert_eq!(asc_all.len(), 5); - assert_eq!(asc_all.get(0).unwrap(), t0); - assert_eq!(asc_all.get(1).unwrap(), t1); - assert_eq!(asc_all.get(2).unwrap(), t2); - assert_eq!(asc_all.get(3).unwrap(), t3); - assert_eq!(asc_all.get(4).unwrap(), t4); - - // Descending (false) full page: [t4, t3, t2, t1, t0] - let desc_all = client.get_charge_history_page(&user, &0u32, &10u32, &false); - assert_eq!(desc_all.len(), 5); - assert_eq!(desc_all.get(0).unwrap(), t4); - assert_eq!(desc_all.get(1).unwrap(), t3); - assert_eq!(desc_all.get(2).unwrap(), t2); - assert_eq!(desc_all.get(3).unwrap(), t1); - assert_eq!(desc_all.get(4).unwrap(), t0); - - // Pagination in ascending direction: - let asc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &true); - assert_eq!(asc_p1.len(), 2); - assert_eq!(asc_p1.get(0).unwrap(), t0); - assert_eq!(asc_p1.get(1).unwrap(), t1); - - let asc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &true); - assert_eq!(asc_p2.len(), 2); - assert_eq!(asc_p2.get(0).unwrap(), t2); - assert_eq!(asc_p2.get(1).unwrap(), t3); - - let asc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &true); - assert_eq!(asc_p3.len(), 1); - assert_eq!(asc_p3.get(0).unwrap(), t4); - - let asc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &true); - assert_eq!(asc_p4.len(), 0); - - // Pagination in descending direction: - let desc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &false); - assert_eq!(desc_p1.len(), 2); - assert_eq!(desc_p1.get(0).unwrap(), t4); - assert_eq!(desc_p1.get(1).unwrap(), t3); - - let desc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &false); - assert_eq!(desc_p2.len(), 2); - assert_eq!(desc_p2.get(0).unwrap(), t2); - assert_eq!(desc_p2.get(1).unwrap(), t1); - - let desc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &false); - assert_eq!(desc_p3.len(), 1); - assert_eq!(desc_p3.get(0).unwrap(), t0); - - let desc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &false); - assert_eq!(desc_p4.len(), 0); -} - -#[test] -fn test_charge_history_sort_edge_cases() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - // Empty history - assert_eq!( - client - .get_charge_history_page(&random, &0u32, &10u32, &true) - .len(), - 0 - ); - assert_eq!( - client - .get_charge_history_page(&random, &0u32, &10u32, &false) - .len(), - 0 - ); - assert_eq!( - client - .get_charge_history_page(&random, &5u32, &10u32, &false) - .len(), - 0 - ); - - // Single entry - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t0 = env.ledger().timestamp(); - - let asc_single = client.get_charge_history_page(&user, &0u32, &10u32, &true); - let desc_single = client.get_charge_history_page(&user, &0u32, &10u32, &false); - assert_eq!(asc_single.len(), 1); - assert_eq!(desc_single.len(), 1); - assert_eq!(asc_single.get(0).unwrap(), t0); - assert_eq!(desc_single.get(0).unwrap(), t0); -} - -#[test] -fn test_clear_charge_history_nonexistent_key_no_panic() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.clear_charge_history(&random); -} - -// ───────────────────────────────────────────── -// contract_health_check tests -// ───────────────────────────────────────────── - -#[test] -fn test_health_check_initialized_unpaused() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - - assert!( - report.is_healthy, - "initialized and unpaused contract should be healthy" - ); - assert!(!report.contract_paused); - assert!(report.token_configured); - assert!(report.admin_configured); -} - -#[test] -fn test_health_check_paused() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - client.pause_contract(); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy, "paused contract should not be healthy"); - assert!(report.contract_paused); -} - -#[test] -fn test_health_check_pre_initialize() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let report = client.contract_health_check(); - - assert!( - !report.token_configured, - "token should not be configured before initialize" - ); - assert!( - !report.is_healthy, - "uninitialized contract should not be healthy" - ); -} - -#[test] -fn test_health_check_active_subscription_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let report = client.contract_health_check(); - assert_eq!(report.active_subscription_count, 1); -} - -// ───────────────────────────────────────────── -// Issue 010: HealthReport field cleanup tests -// ───────────────────────────────────────────── - -#[test] -fn test_health_check_healthy_fully_configured() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - - assert!(report.is_healthy); - assert!(!report.contract_paused); - assert!(report.token_configured); - assert!(report.admin_configured); - assert!(report.instance_ttl_ledgers > 0); - // pending_merchant_rev_count is 0 when no merchants have revenue - assert_eq!(report.pending_merchant_rev_count, 0); -} - -#[test] -fn test_health_check_paused_not_healthy() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.pause_contract(); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy); - assert!(report.contract_paused); -} - -#[test] -fn test_health_check_unconfigured_not_healthy() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy); - assert!(!report.token_configured); - assert!(!report.admin_configured); -} - -/// Verify that TTL is reported as a positive value (test builds use real get_ttl). -#[test] -fn test_health_check_ttl_is_positive() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - assert!( - report.instance_ttl_ledgers > 0, - "instance_ttl_ledgers should be positive in test builds" - ); -} - -#[test] -fn test_ttl_extension() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // We can't easily assert the exact TTL in the test environment without more complex mock_all_auths - // or internal access, but we can verify the function exists and doesn't panic. - - // Keep the contract instance itself alive across the jump below — only the - // Subscription entry's TTL is extended by extend_subscription_ttl, but the - // contract instance needs its own TTL or the whole contract becomes archived. - // Extend a bit past SUBSCRIPTION_TTL_LEDGERS to cover the two ledger jumps below. - env.as_contract(&contract_id, || { - env.storage() - .instance() - .extend_ttl(SUBSCRIPTION_TTL_LEDGERS + 10, SUBSCRIPTION_TTL_LEDGERS + 10); - }); - - env.ledger().with_mut(|l| { - l.sequence_number += SUBSCRIPTION_TTL_LEDGERS - 1; - }); - - client.extend_subscription_ttl(&user); - - assert!(client.get_subscription(&user).is_some()); -} - -// ───────────────────────────────────────────── -// Issue 013: PauseExpiry TTL coupled with subscription bump -// ───────────────────────────────────────────── - -#[test] -fn test_bump_subscription_extends_pause_expiry_when_present() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - // Verify PauseExpiry exists before bump - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should exist after pause_until"); - }); - - // Bump subscription TTL — should also bump PauseExpiry - client.bump_subscription(&user); - - // PauseExpiry should still exist (not archived) - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should survive bump_subscription"); - assert_eq!(expiry.unwrap(), 90000); - }); -} - -#[test] -fn test_bump_subscription_no_op_on_absent_pause_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - // No PauseExpiry — bump should be a safe no-op - client.bump_subscription(&user); - - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(expiry, None, "PauseExpiry should remain absent"); - }); -} - -#[test] -fn test_batch_extend_extends_pause_expiry_when_present() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &200000); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_extend_subscription_ttl(&users); - - // PauseExpiry should survive batch extend - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should survive batch_extend"); - assert_eq!(expiry.unwrap(), 200000); - }); -} - -#[test] -fn test_pause_then_batch_extend_then_auto_resume() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - // Batch extend keeps PauseExpiry alive - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_extend_subscription_ttl(&users); - - // Advance to expiry — auto-resume should still work - env.ledger().set_timestamp(90000); - let mut users2 = soroban_sdk::Vec::new(&env); - users2.push_back(user.clone()); - let result = client.batch_charge(&users2); - assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); -} - -// ───────────────────────────────────────────── -// CONTRACT-22: bump_instance_ttl tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_extends_instance_ttl() { - use soroban_sdk::testutils::storage::Instance as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS / 2); -} - -#[test] -fn test_initialize_sets_instance_ttl() { - use soroban_sdk::testutils::storage::Instance as _; - - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin); - let admin = Address::generate(&env); - - client.initialize(&token_id.address(), &admin); - - let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl > 0); -} - -#[test] -fn test_bump_instance_ttl_is_permissionless_and_state_preserving() { - use soroban_sdk::testutils::storage::Instance as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - env.ledger().with_mut(|ledger| { - ledger.max_entry_ttl = SUBSCRIPTION_TTL_LEDGERS * 2; - }); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let admin_before = client.get_admin(); - let token_before = client.get_token(); - let fee_before = client.get_fee(); - let subscription_before = client.get_subscription(&user); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += SUBSCRIPTION_TTL_LEDGERS / 2 + 100; - }); - let ttl_before = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - - env.set_auths(&[]); - client.bump_instance_ttl(); - - let ttl_after = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl_after > ttl_before); - assert!(ttl_after >= SUBSCRIPTION_TTL_LEDGERS); - assert_eq!(client.get_admin(), admin_before); - assert_eq!(client.get_token(), token_before); - assert_eq!(client.get_fee(), fee_before); - assert_eq!(client.get_subscription(&user), subscription_before); - - client.bump_instance_ttl(); - let repeated_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(repeated_ttl >= ttl_after); -} - -#[test] -#[should_panic] -fn test_subscribe_interval_under_60_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); -} - -#[test] -fn test_subscribe_interval_minimum_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.set_min_interval(&60u64); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.interval, 3600); -} - -#[test] -#[should_panic(expected = "Error(Contract, #15)")] -fn test_subscribe_amount_above_cap_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &(MAX_SUBSCRIPTION_AMOUNT + 1)); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &(MAX_SUBSCRIPTION_AMOUNT + 1), &200); - - client.subscribe( - &user, - &merchant, - &(MAX_SUBSCRIPTION_AMOUNT + 1), - &86400, - &token_addr, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_amount_at_cap_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &MAX_SUBSCRIPTION_AMOUNT); - let token = soroban_sdk::token::Client::new(&env, &token_addr); - token.approve(&user, &contract_id, &MAX_SUBSCRIPTION_AMOUNT, &200); - - client.subscribe( - &user, - &merchant, - &MAX_SUBSCRIPTION_AMOUNT, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user, - &merchant, - &MAX_SUBSCRIPTION_AMOUNT, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.amount, MAX_SUBSCRIPTION_AMOUNT); -} - -// ───────────────────────────────────────────── -// Admin transfer tests -// ───────────────────────────────────────────── - -#[test] -fn test_transfer_admin() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - // Step 1: propose - client.transfer_admin(&new_admin); - // Step 2: accept - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_eq!(current_admin, new_admin); -} - -#[test] -fn test_transfer_admin_event_emitted() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - client.transfer_admin(&new_admin); - client.accept_admin(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (emitted_old_admin, emitted_new_admin): (Address, Address) = - data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "admin_transferred")); - assert_eq!(emitted_old_admin, old_admin); - assert_eq!(emitted_new_admin, new_admin); -} - -#[test] -fn test_transfer_admin_requires_auth() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - client.transfer_admin(&new_admin); - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_eq!(current_admin, new_admin); -} - -#[test] -fn test_old_admin_loses_access_after_transfer() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - client.transfer_admin(&new_admin); - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_ne!(current_admin, old_admin); -} - -#[test] -#[should_panic] -fn test_accept_admin_without_proposal_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.accept_admin(); -} - -#[test] -fn test_initialize_without_valid_token() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - // Using a user address instead of a token contract address. - // The contract currently does not validate if the address is a valid token contract - // or even if it's a contract at all. - let invalid_token = Address::generate(&env); - let admin = Address::generate(&env); - - client.initialize(&invalid_token, &admin); - - // Success means it didn't panic, which is the current expected behavior. -} - -// ───────────────────────────────────────────── -// Global volume cap tests -// ───────────────────────────────────────────── - -/// Helper: set up a user with a large balance for global volume testing -fn setup_large_balance(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &100_000_000_000_000); - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &100_000_000_000_000, &200000); - user -} - -#[test] -fn test_global_volume_within_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_000_0000000; // well under limit - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - // Should succeed - well under the 50 trillion stroops limit -} - -#[test] -#[should_panic] -fn test_global_volume_exceeds_limit() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Give users large balances to exceed the 50_000_000_000_000 limit - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 30_000_000_000_000; // 30 trillion stroops each - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // First charge succeeds (30 trillion used) - client.charge(&user_a); - - // Second charge should panic (60 trillion total > 50 trillion limit) - client.charge(&user_b); -} - -#[test] -fn test_global_volume_window_reset() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 1_000_0000000; // well under MAX_AMOUNT - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user_a); // 5 trillion used this window - - // Advance time past the 1-hour window boundary (3601 seconds) - env.ledger().with_mut(|l| { - l.timestamp += 3601; - }); - - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - - // This charge should succeed because the window has reset - client.charge(&user_b); -} - -// ───────────────────────────────────────────── -// Issue #10: get_global_volume_window tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_global_volume_window_returns_zero_on_fresh_contract() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let (volume, window_start) = client.get_global_volume_window(); - assert_eq!(volume, 0, "accumulated volume should be 0 on fresh contract"); - assert_eq!(window_start, 0, "window start should be 0 on fresh contract"); -} - -#[test] -fn test_get_global_volume_window_correct_values_after_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_000_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - let charge_time = env.ledger().timestamp(); - client.charge(&user); - - let (volume, window_start) = client.get_global_volume_window(); - assert_eq!(volume, amount, "accumulated volume should equal the charged amount"); - assert_eq!(window_start, charge_time, "window_start should equal ledger timestamp at charge time"); -} - -#[test] -fn test_get_global_volume_window_resets_after_hour() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 1_000_0000000; - let interval: u64 = 86400; - - client.subscribe(&user_a, &merchant, &amount, &interval, &token_addr, &None, &None); - client.subscribe(&user_b, &merchant, &amount, &interval, &token_addr, &None, &None); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user_a); - - // Confirm volume accumulated in the first window - let (volume_before, _) = client.get_global_volume_window(); - assert_eq!(volume_before, amount); - - // Advance past the 1-hour window boundary - env.ledger().with_mut(|l| { - l.timestamp += 3601; - }); - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - let second_charge_time = env.ledger().timestamp(); - client.charge(&user_b); - - // Window should have reset: only the second charge amount is accumulated - let (volume_after, window_start_after) = client.get_global_volume_window(); - assert_eq!(volume_after, amount, "volume should reset to just the new charge amount after window expiry"); - assert_eq!(window_start_after, second_charge_time, "window_start should be the new charge time after reset"); -} - - - -// ───────────────────────────────────────────── -// subscribe_with_metadata tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_with_metadata_success() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let label = soroban_sdk::String::from_str(&env, "Pro Plan"); - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe_with_metadata( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - &label, - ); - - // Verify subscription is created - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - - // Verify metadata is set - assert_eq!(client.get_metadata(&user), Some(label)); -} - -#[test] -#[should_panic] -fn test_subscribe_with_metadata_label_too_long() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Create a 65-byte label (exceeds 64-byte limit) - let long_label = soroban_sdk::String::from_str( - &env, - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", // 65 chars - ); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - // Should panic with MetadataLabelTooLong - client.subscribe_with_metadata( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - &long_label, - ); -} - -#[test] -#[should_panic] -fn test_subscribe_with_metadata_no_subscription_on_label_failure() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let long_label = soroban_sdk::String::from_str( - &env, - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", - ); - - // Label validation happens before subscribe_inner, so no subscription should be written. - // This panics before any storage write — we verify that by catching the panic separately - // in test_subscribe_with_metadata_label_too_long. Here we just assert the panic occurs. - client.subscribe_with_metadata( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - &long_label, - ); -} - -// ───────────────────────────────────────────── -// get_protocol_stats tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_protocol_stats_initial() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let stats = client.get_protocol_stats(); - - assert_eq!(stats.active_count, 0); - assert_eq!(stats.fee_bps, 0); - assert!(stats.fee_collector.is_none()); - assert_eq!(stats.grace_period, 0); - assert!(!stats.whitelist_enabled); - assert_eq!(stats.schema_version, 0); // default unmigrated version - assert!(!stats.contract_paused); -} - -#[test] -fn test_get_protocol_stats_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let stats = client.get_protocol_stats(); - assert_eq!(stats.active_count, 1); -} - -#[test] -fn test_get_protocol_stats_with_fee() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Set admin directly in instance storage so admin-gated functions work - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - env.mock_all_auths(); - let fee_collector = Address::generate(&env); - client.propose_fee(&fee_collector, &100); // 1% fee - client.commit_fee(); - - let stats = client.get_protocol_stats(); - assert_eq!(stats.fee_bps, 100); - assert_eq!(stats.fee_collector, Some(fee_collector)); -} - -#[test] -fn test_get_protocol_stats_contract_paused() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Set admin directly in instance storage so admin-gated functions work - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - env.mock_all_auths(); - client.pause_contract(); - - let stats = client.get_protocol_stats(); - assert!(stats.contract_paused); - - client.unpause_contract(); - let stats_after = client.get_protocol_stats(); - assert!(!stats_after.contract_paused); -} - -#[test] -fn test_resubscribe() { - let (env, contract_id, token_addr, user, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - // Initial subscription - client.subscribe( - &user, - &merchant_a, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let sub1 = client.get_subscription(&user).unwrap(); - assert_eq!(sub1.merchant, merchant_a); - assert_eq!(sub1.amount, 1_0000000); - - // Subscribe again with different parameters - client.subscribe( - &user, - &merchant_b, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - let sub2 = client.get_subscription(&user).unwrap(); - - assert_eq!(sub2.merchant, merchant_b); - assert_eq!(sub2.amount, 2_0000000); - assert_eq!(sub2.interval, 172800); - - // Verify old merchant is gone - assert_ne!(sub2.merchant, merchant_a); -} - -#[test] -fn test_subscribe_overwrites_cancelled_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. Cancel - client.cancel(&user); - let sub_cancelled = client.get_subscription(&user).unwrap(); - assert!(!sub_cancelled.active); - - // 3. Subscribe again - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - - // 4. Verify new subscription is active - let sub_new = client.get_subscription(&user).unwrap(); - assert!(sub_new.active); - assert_eq!(sub_new.amount, 2_0000000); -} - -// ───────────────────────────────────────────── -// min_interval tests -// ───────────────────────────────────────────── - -/// get_min_interval returns 3600 (1 hour) before any admin configuration. -#[test] -fn test_get_min_interval_default() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - assert_eq!(client.get_min_interval(), 3600); -} - -#[test] -fn test_min_interval_event_emitted_on_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - - // Verify default value is 3600 before setting - assert_eq!(client.get_min_interval(), 3600); - - // First set: old value should be 3600 default, new value 7200 - client.set_min_interval(&7200u64); - assert_eq!(client.get_min_interval(), 7200); - - let events_vec = env.events().all(); - let (_, topics, data) = events_vec.get(events_vec.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "min_interval_set")); - - let event_data: events::MinIntervalSetEventData = data.try_into_val(&env).unwrap(); - assert_eq!(event_data.old, 3600); - assert_eq!(event_data.new, 7200); - - // Second set: old value 7200, new value 86400 - client.set_min_interval(&86400u64); - assert_eq!(client.get_min_interval(), 86400); - - let events_vec2 = env.events().all(); - let (_, topics2, data2) = events_vec2.get(events_vec2.len() - 1).unwrap(); - let topic_symbol2: Symbol = topics2.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol2, Symbol::new(&env, "min_interval_set")); - - let event_data2: events::MinIntervalSetEventData = data2.try_into_val(&env).unwrap(); - assert_eq!(event_data2.old, 7200); - assert_eq!(event_data2.new, 86400); - - // Same value set again: old == 86400, new == 86400 - client.set_min_interval(&86400u64); - let events_vec3 = env.events().all(); - let (_, topics3, data3) = events_vec3.get(events_vec3.len() - 1).unwrap(); - let topic_symbol3: Symbol = topics3.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol3, Symbol::new(&env, "min_interval_set")); - - let event_data3: events::MinIntervalSetEventData = data3.try_into_val(&env).unwrap(); - assert_eq!(event_data3.old, 86400); - assert_eq!(event_data3.new, 86400); -} - -#[test] -fn test_top_merchants_by_subs() { - let (env, contract_id, token_addr, _user, _m) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - - client.add_merchant(&m1); - client.add_merchant(&m2); - client.add_merchant(&m3); - - // Create subscriptions for m1 (1 sub), m2 (3 subs), m3 (2 subs) - let u1 = setup_funded_user(&env, &contract_id, &token_addr); - let u2 = setup_funded_user(&env, &contract_id, &token_addr); - let u3 = setup_funded_user(&env, &contract_id, &token_addr); - let u4 = setup_funded_user(&env, &contract_id, &token_addr); - let u5 = setup_funded_user(&env, &contract_id, &token_addr); - let u6 = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); - - client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u3, &m2, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u4, &m2, &1_0000000, &86400, &token_addr, &None, &None); - - client.subscribe(&u5, &m3, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u6, &m3, &1_0000000, &86400, &token_addr, &None, &None); - - // Top 3 merchants: m2 (3 subs), m3 (2 subs), m1 (1 sub) - let top = client.get_top_merchants_by_subs(&3u32); - assert_eq!(top.len(), 3); - assert_eq!(top.get(0).unwrap(), (m2.clone(), 3u32)); - assert_eq!(top.get(1).unwrap(), (m3.clone(), 2u32)); - assert_eq!(top.get(2).unwrap(), (m1.clone(), 1u32)); - - // Unknown / unindexed merchant returns 0 for subscriber count query - let unindexed = Address::generate(&env); - assert_eq!(client.get_merchant_sub_count(&unindexed), 0); -} - -#[test] -fn test_top_merchants_tie_breaking_and_limit() { - let (env, contract_id, token_addr, _user, _m) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - - // Add m1 first, then m2 - client.add_merchant(&m1); - client.add_merchant(&m2); - - let u1 = setup_funded_user(&env, &contract_id, &token_addr); - let u2 = setup_funded_user(&env, &contract_id, &token_addr); - - // Both m1 and m2 get 1 sub (tie) - client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); - - // Tie-breaking preserves index order: m1 first, m2 second - let top = client.get_top_merchants_by_subs(&2u32); - assert_eq!(top.len(), 2); - assert_eq!(top.get(0).unwrap(), (m1.clone(), 1u32)); - assert_eq!(top.get(1).unwrap(), (m2.clone(), 1u32)); - - // Limit 1 returns top 1 - let top1 = client.get_top_merchants_by_subs(&1u32); - assert_eq!(top1.len(), 1); - assert_eq!(top1.get(0).unwrap(), (m1.clone(), 1u32)); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_top_merchants_limit_exceeded_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.get_top_merchants_by_subs(&21u32); -} - -/// subscribe panics with IntervalTooShort when interval < default floor of 3600. -#[test] -#[should_panic] -fn test_subscribe_interval_too_short_panics_default_floor() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // 1800 seconds (30 min) < 3600 default floor - client.subscribe( - &user, - &merchant, - &1_0000000, - &1800, - &token_addr, - &None, - &None, - ); -} - -/// Lowering the floor via set_min_interval then subscribing at the new floor succeeds. -#[test] -fn test_subscribe_after_set_min_interval_lower_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - client.set_min_interval(&60u64); - - assert_eq!(client.get_min_interval(), 60); - // 60 seconds == new floor — should succeed - client.subscribe(&user, &merchant, &1_0000000, &60, &token_addr, &None, &None); - assert!(client.get_subscription(&user).unwrap().active); -} - -#[test] -fn prop_subscribe_interval_respects_min_interval_floor() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let default_floor = client.get_min_interval(); - - let mut state = 0x9e3779b97f4a7c15u64; - for sample in 0..4 { - state ^= state << 7; - state ^= state >> 9; - let interval = if sample == 0 { - 0 - } else { - state % default_floor - }; - let user = setup_funded_user(&env, &contract_id, &token_addr); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - })); - assert!(result.is_err(), "interval {interval} must be rejected"); - } - - for offset in 0..4 { - let interval = default_floor + offset; - let user = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscription(&user).unwrap().interval, interval); - } - - let admin = Address::generate(&env); - client.set_initial_admin(&admin); - let updated_floor = 97u64; - client.set_min_interval(&updated_floor); - assert_eq!(client.get_min_interval(), updated_floor); - - for sample in 0..4 { - state ^= state << 7; - state ^= state >> 9; - let interval = if sample == 0 { - 0 - } else { - state % updated_floor - }; - let user = setup_funded_user(&env, &contract_id, &token_addr); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - })); - assert!(result.is_err(), "updated floor rejected interval {interval}"); - } - - for offset in 0..4 { - let interval = updated_floor + offset; - let user = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscription(&user).unwrap().interval, interval); - } -} - -/// set_min_interval(0) panics. -#[test] -#[should_panic(expected = "min interval must be positive")] -fn test_set_min_interval_zero_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - client.set_min_interval(&0u64); -} - -/// Calling set_min_interval without a configured admin panics. -#[test] -#[should_panic(expected = "admin not set")] -fn test_set_min_interval_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // No admin configured — require_admin panics with "admin not set" - client.set_min_interval(&7200u64); -} - -// ───────────────────────────────────────────── -// clear_merchant_revenue_history tests -// ───────────────────────────────────────────── - -/// Admin can clear history; subsequent query returns an empty Vec (zero-length). -/// Clearing does not affect the cumulative revenue total. -#[test] -fn test_clear_merchant_revenue_history_drops_history() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - - // Produce some history via a charge - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - // History should have one entry - let history_before = client.get_merchant_revenue_history(&merchant, &10u32); - assert_eq!(history_before.len(), 1); - - // Cumulative revenue is present - let revenue = client.get_merchant_revenue(&merchant); - assert!(revenue > 0); - - // Clear history as admin - client.clear_merchant_revenue_history(&merchant); - - // History is now zero-length - let history_after = client.get_merchant_revenue_history(&merchant, &10u32); - assert_eq!(history_after.len(), 0); - - // Cumulative revenue is untouched - assert_eq!(client.get_merchant_revenue(&merchant), revenue); -} - -/// Clearing history for a merchant with no recorded data is idempotent (does not panic). -#[test] -fn test_clear_merchant_revenue_history_idempotent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - let unknown_merchant = Address::generate(&env); - - client.set_initial_admin(&admin); - - // First call — no data exists, must not panic - client.clear_merchant_revenue_history(&unknown_merchant); - // Second call — still no data, must not panic - client.clear_merchant_revenue_history(&unknown_merchant); - - assert_eq!( - client - .get_merchant_revenue_history(&unknown_merchant, &5u32) - .len(), - 0 - ); -} - -/// Calling clear_merchant_revenue_history without an admin configured panics. -#[test] -#[should_panic(expected = "admin not set")] -fn test_clear_merchant_revenue_history_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // No admin configured — require_admin panics - client.clear_merchant_revenue_history(&merchant); -} - -// ───────────────────────────────────────────── -// Subscriber index tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscriber_index_three_unique_users() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let user_c = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_c, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_count(), 3); - - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 3); - assert_eq!(page.get(0).unwrap(), user_a); - assert_eq!(page.get(1).unwrap(), user_b); - assert_eq!(page.get(2).unwrap(), user_c); -} - -#[test] -fn test_get_subscriber_at_returns_first() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_at(&0u64), Some(user)); - assert_eq!(client.get_subscriber_at(&1u64), None); -} - -#[test] -fn test_resubscribe_active_does_not_duplicate_index() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - // Re-subscribe while still active — must not append a second entry - client.subscribe( - &user, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 1); -} - -#[test] -fn test_subscriber_page_offset_beyond_count_returns_empty() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - let page = client.get_subscriber_page(&1u64, &10u32); - assert_eq!(page.len(), 0); - - let page_zero_limit = client.get_subscriber_page(&0u64, &0u32); - assert_eq!(page_zero_limit.len(), 0); -} - -#[test] -#[cfg(feature = "bench")] -fn test_subscriber_page_limit_capped_at_50() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let sac = StellarAssetClient::new(&env, &token_addr); - let token = TokenClient::new(&env, &token_addr); - - for _ in 0..52 { - let sub_user = Address::generate(&env); - sac.mint(&sub_user, &10_000_0000000); - token.approve(&sub_user, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &sub_user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - } - - assert_eq!(client.get_subscriber_count(), 53); - - let page = client.get_subscriber_page(&0u64, &100u32); - assert_eq!(page.len(), 50); -} -// Issue #231: token.rs SAC compatibility test -// ───────────────────────────────────────────── - -/// Test that a custom SAC token (not native XLM) works end-to-end -/// with subscribe, charge, and pay_per_use operations. -#[test] -fn test_custom_sac_token_end_to_end_flow() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Setup a custom SAC token (not the default one from setup()) - let custom_token = setup_second_token(&env, &contract_id, &user); - let token = TokenClient::new(&env, &custom_token); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - // Step 1: Subscribe with custom SAC token - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &custom_token, - &None, - &None, - ); - - // Verify subscription uses the custom token - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - assert_eq!( - sub.token, custom_token, - "subscription should use custom SAC token" - ); - - // Step 2: Charge after interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - client.charge(&user); - - let user_balance_after = token.balance(&user); - let merchant_balance_after = token.balance(&merchant); - - // Verify exact amount transferred - assert_eq!( - user_balance_before - user_balance_after, - amount, - "user balance should decrease by subscription amount" - ); - assert_eq!( - merchant_balance_after - merchant_balance_before, - amount, - "merchant balance should increase by subscription amount" - ); - - // Step 3: Pay-per-use with custom SAC token - let user_balance_before_ppu = token.balance(&user); - let merchant_balance_before_ppu = token.balance(&merchant); - - let ppu_amount: i128 = 2_0000000; - client.pay_per_use(&user, &ppu_amount); - - let user_balance_after_ppu = token.balance(&user); - let merchant_balance_after_ppu = token.balance(&merchant); - - // Verify pay-per-use amount transferred - assert_eq!( - user_balance_before_ppu - user_balance_after_ppu, - ppu_amount, - "user balance should decrease by pay_per_use amount" - ); - assert_eq!( - merchant_balance_after_ppu - merchant_balance_before_ppu, - ppu_amount, - "merchant balance should increase by pay_per_use amount" - ); - - // Verify subscription is still active after pay_per_use - let sub_final = client.get_subscription(&user).unwrap(); - assert!( - sub_final.active, - "subscription should remain active after pay_per_use" - ); -} - -// ───────────────────────────────────────────────────────────── -// Issue #237: get_token() read function tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_get_token_returns_none_when_not_initialized() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - assert!(client.get_token().is_none()); -} - -#[test] -fn test_get_token_returns_initialized_token() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); -} - -// ───────────────────────────────────────────── -// Issue: get_grace_period getter -// ───────────────────────────────────────────── - -#[test] -fn test_get_grace_period_default_zero() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - assert_eq!(client.get_grace_period(), 0); -} - -#[test] -fn test_get_grace_period_after_set() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - client.propose_grace_period(&3600); - client.commit_grace_period(); - assert_eq!(client.get_grace_period(), 3600); -} - -// ───────────────────────────────────────────── -// Issue: fee_updated event on set_fee -// ───────────────────────────────────────────── - -#[test] -fn test_set_fee_emits_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - client.commit_fee(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (emitted_collector, emitted_bps): (Address, u32) = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); - assert_eq!(emitted_collector, collector); - assert_eq!(emitted_bps, 100u32); -} - -#[test] -fn test_get_fee_returns_current_fee_settings() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &250); - client.commit_fee(); - - assert_eq!(client.get_fee(), Some((collector, 250u32))); -} - -#[test] -#[should_panic] -fn test_set_fee_invalid_bps_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &10001); - client.commit_fee(); -} - -// ───────────────────────────────────────────── -// Issue: grace_period_updated event on set_grace_period -// ───────────────────────────────────────────── - -#[test] -fn test_set_grace_period_emits_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_grace_period(&7200); - client.commit_grace_period(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let emitted_seconds: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "grace_period_committed")); - assert_eq!(emitted_seconds, 7200u64); -} - -// ───────────────────────────────────────────── -// Issue #195: grace period charge behavior -// ───────────────────────────────────────────── - -#[test] -fn test_charge_within_grace_window_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Past billing interval but still inside grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period / 2; - }); - - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.last_charged, env.ledger().timestamp()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #9)")] -fn test_charge_after_grace_window_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_non_admin_set_grace_period_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.propose_grace_period(&3600); - client.commit_grace_period(); -} - -// ───────────────────────────────────────────── - -// ------------------------------------------------------------- -// Issue #45: resume/cancel on grace-lapsed subscriptions -// ------------------------------------------------------------- - - -/// resume on a grace-lapsed subscription must panic with ResumeGraceLapsed (#100). -#[test] -#[should_panic(expected = "Error(Contract, #100)")] -fn test_resume_after_grace_lapse_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval + grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - // resume must be rejected because the grace window has closed - client.resume(&user); -} - -/// cancel on a grace-lapsed subscription must still succeed. -#[test] -fn test_cancel_after_grace_lapse_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval + grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - // cancel must still be allowed so the user can exit cleanly - client.cancel(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active, "subscription should be inactive after cancel"); -} - -/// resume within a valid (non-lapsed) grace window must succeed normally. -#[test] -fn test_resume_within_grace_window_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval but still inside the grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period / 2; - }); - - // resume must succeed because the grace window has not yet closed - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.paused, "subscription should not be paused after resume"); - assert!(sub.active, "subscription should remain active"); -} - -/// resume when no grace period is configured must succeed regardless of elapsed time. -#[test] -fn test_resume_no_grace_period_always_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No grace period set -- default is 0 - let interval: u64 = 86400; - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance far past the interval -- grace is 0 so lapse check is skipped - env.ledger().with_mut(|l| { - l.timestamp += interval * 10; - }); - - // resume must succeed because grace_period == 0 means no lapse - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.paused, "subscription should not be paused after resume"); -} - -// Issue #243: Token address validation -// ───────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #12)")] -fn test_subscribe_non_contract_address() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Provide a non-contract address (just an account) - use soroban_sdk::xdr::{AccountId, PublicKey, ScAddress, Uint256}; - use soroban_sdk::TryFromVal; - let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0; 32]))); - let non_contract_token = Address::try_from_val(&env, &ScAddress::Account(account_id)).unwrap(); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &non_contract_token, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_valid_sac_token_address_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.token, token_addr); -} - -// Issue #232: charge() insufficient-allowance error path -// ───────────────────────────────────────────── - -/// If a user's token allowance drops below `sub.amount` between subscribe and -/// charge time, `transfer_from` must fail and propagate the error. -#[test] -#[should_panic] -fn test_charge_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - // Subscribe with sufficient allowance - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Revoke allowance — set it to 0 - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &200); - - // Advance ledger past the interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // charge() should panic because transfer_from fails with insufficient allowance - client.charge(&user); -} - -#[test] -fn test_set_metadata_label_at_limit_succeeds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let valid_label = soroban_sdk::String::from_str( - &env, - "this_is_a_perfectly_valid_sixty_four_character_metadata_label_ok", - ); - assert_eq!(valid_label.len(), 64); - - client.set_metadata(&user, &valid_label); - - assert_eq!(client.get_metadata(&user), Some(valid_label)); -} - -#[test] -#[should_panic] -fn test_set_metadata_label_exceeding_limit_fails() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let invalid_label = soroban_sdk::String::from_str( - &env, - "this_is_an_invalid_sixty_five_character_metadata_label_too_long_!", - ); - assert_eq!(invalid_label.len(), 65); - - client.set_metadata(&user, &invalid_label); -} -// ───────────────────────────────────────────── -// Issue #469: set_subscription_label auth and alias tests -// ───────────────────────────────────────────── -#[test] -fn test_set_metadata_wrong_user_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let attacker = Address::generate(&env); - let label = soroban_sdk::String::from_str(&env, "hacked"); - client.set_metadata(&attacker, &label); -} - -#[test] -fn test_get_subscription_label_returns_set_value() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let label = soroban_sdk::String::from_str(&env, "premium"); - client.set_metadata(&user, &label); - assert_eq!(client.get_subscription_label(&user), Some(label)); -} - -#[test] -fn test_get_subscription_label_none_when_not_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - assert!(client.get_subscription_label(&random).is_none()); -} - -// ───────────────────────────────────────────── -// Tests for pause() and resume() -// ───────────────────────────────────────────── - -#[test] -fn test_pause_sets_paused_true() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.paused); -} - -#[test] -#[should_panic] -fn test_charge_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_pay_per_use_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - client.pay_per_use(&user, &1_0000000); -} - -#[test] -fn test_resume_unpauses_and_charge_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - client.resume(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.last_charged > 0); -} - -#[test] -#[should_panic] -fn test_pause_on_inactive_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - client.pause(&user); -} - -// ───────────────────────────────────────────── -// Tests for next_charge_at() -// ───────────────────────────────────────────── - -#[test] -fn test_next_charge_at_returns_correct_timestamp() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - let expected = sub.last_charged + sub.interval; - let got = client.next_charge_at(&user).unwrap(); - assert_eq!(got, expected); -} - -#[test] -fn test_next_charge_at_none_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - assert!(client.next_charge_at(&user).is_none()); -} - -#[test] -fn test_next_charge_at_none_for_unknown_address() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!(client.next_charge_at(&random).is_none()); -} - -#[test] -fn test_transfer_subscription_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.transfer_subscription(&user, &new_user); - - assert!( - client.get_subscription(&user).is_none(), - "old subscription should be removed" - ); - - let new_sub = client.get_subscription(&new_user).unwrap(); - assert!(new_sub.active, "new subscription should be active"); - assert_eq!(new_sub.merchant, merchant); - assert_eq!(new_sub.amount, 1_0000000); - assert_eq!(client.get_subscriber_count(), 2); - assert_eq!(client.get_subscriber_at(&0u64), None); - assert_eq!(client.get_subscriber_at(&1u64), Some(new_user)); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); -} - -#[test] -fn test_transfer_subscription_to_inactive_user_reuses_tombstone_membership() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let new_user = setup_funded_user(&env, &contract_id, &token_addr); - let inactive_merchant = Address::generate(&env); - - client.subscribe( - &new_user, - &inactive_merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&new_user); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &new_user); - - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - assert_eq!(client.get_merchant_sub_count(&inactive_merchant), 0); - assert_eq!(client.get_subscriber_count(), 3); - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 1); - assert_eq!(page.get(0).unwrap(), new_user); -} - -#[test] -fn test_transfer_subscription_event_emitted() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.transfer_subscription(&user, &new_user); - - let mut seen_transfer_event = false; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - if topic_symbol == Symbol::new(&env, "subscription_transferred") { - let topic_from: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let topic_to: Address = topics.get(2).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_from, user); - assert_eq!(topic_to, new_user); - - let event_payload: (Address, i128, u64, Address) = data.try_into_val(&env).unwrap(); - assert_eq!(event_payload.0, merchant); - assert_eq!(event_payload.1, 1_0000000); - assert_eq!(event_payload.2, 86400); - assert_eq!(event_payload.3, token_addr); - seen_transfer_event = true; - } - } - - assert!( - seen_transfer_event, - "expected a subscription_transferred event" - ); -} - -#[test] -#[should_panic] -fn test_transfer_subscription_to_active_user_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &new_user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &new_user); -} -// ───────────────────────────────────────────── -// CONTRACT-08: Allowance pre-validation tests -// ───────────────────────────────────────────── - -/// subscribe() with zero allowance must panic with InsufficientAllowance -/// and must NOT write the subscription to storage. -#[test] -#[should_panic(expected = "Error(Contract, #8)")] -fn test_subscribe_zero_allowance_panics() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION - // so that subscribe_inner's migration invariant guard is satisfied. - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // Deliberately grant zero allowance — no approve() call. - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -/// After a zero-allowance subscribe() panic, get_subscription() must return None, -/// confirming no storage was written. -/// Note: In the Soroban test environment, panics abort the entire transaction, -/// so storage changes from the failed call are never committed. We verify this -/// by reading storage directly inside the contract after a successful (non-panicking) -/// path: a user who was never subscribed must always return None. -#[test] -fn test_subscribe_zero_allowance_does_not_write_storage() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION - // so that subscribe_inner's migration invariant guard is satisfied. - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); - }); - - let user = Address::generate(&env); - - // Never approved any allowance — a subscribe call would panic. - // Soroban transactions are atomic: a panic reverts all storage writes. - // We confirm the storage slot starts empty (None) and — since we cannot - // call subscribe without panicking — we verify the invariant holds: a - // user address that has never successfully subscribed always returns None. - let client = FlowPayClient::new(&env, &contract_id); - assert!( - client.get_subscription(&user).is_none(), - "subscription must not be stored for a user who has never successfully subscribed" - ); -} - -/// subscribe() with allowance exactly equal to amount must succeed. -#[test] -fn test_subscribe_exact_allowance_succeeds() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let amount: i128 = 5_0000000; - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // Approve exactly amount — no more, no less. - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &amount, &200); - - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active, "subscription should be active"); - assert_eq!(sub.amount, amount); -} - -/// Re-subscribe (overwriting a cancelled subscription) with zero allowance -/// must also panic with InsufficientAllowance. -#[test] -#[should_panic(expected = "Error(Contract, #8)")] -fn test_resubscribe_zero_allowance_panics() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let amount: i128 = 1_0000000; - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // First subscribe with sufficient allowance. - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &10_000_0000000, &200); - - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - client.cancel(&user); - - // Revoke allowance so second subscribe sees zero. - token.approve(&user, &contract_id, &0, &200); - - // Re-subscribe must panic because allowance is zero. - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); -} - -// ───────────────────────────────────────────── -// CONTRACT-36: set_subscription_amount tests -// ───────────────────────────────────────────── - -/// Admin successfully updates a subscription amount; get_subscription reflects -/// the new value and last_charged / interval are untouched. -#[test] -fn test_set_subscription_amount_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let original_amount: i128 = 1_0000000; - let new_amount: i128 = 3_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &original_amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - assert_eq!(sub_before.amount, original_amount); - let last_charged_before = sub_before.last_charged; - - client.set_subscription_amount(&user, &new_amount); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!(sub_after.amount, new_amount, "amount should be updated"); - assert_eq!( - sub_after.last_charged, last_charged_before, - "last_charged must not change" - ); - assert_eq!(sub_after.interval, interval, "interval must not change"); - assert!(sub_after.active, "subscription should remain active"); -} - -/// Updating a non-existent subscription must panic with NoSubscriptionFound. -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_set_subscription_amount_no_subscription_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.set_subscription_amount(&random, &2_0000000); -} - -/// A non-admin caller must not be able to update a subscription amount. -#[test] -#[should_panic] -fn test_set_subscription_amount_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Remove all authorizations so the admin auth check fails. - env.set_auths(&[]); - - client.set_subscription_amount(&user, &2_0000000); -} - -// ───────────────────────────────────────────── -// CONTRACT-37: set_subscription_interval tests -// ───────────────────────────────────────────── - -/// Admin successfully updates the billing interval; next_charge_at reflects the -/// new value and last_charged / amount are untouched. -#[test] -fn test_set_subscription_interval_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let amount: i128 = 1_0000000; - let original_interval: u64 = 86400; // 1 day - let new_interval: u64 = 30 * 24 * 3600; // 30 days - - client.subscribe( - &user, - &merchant, - &amount, - &original_interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - assert_eq!(sub_before.interval, original_interval); - let last_charged_before = sub_before.last_charged; - let amount_before = sub_before.amount; - - client.set_subscription_interval(&user, &new_interval); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!( - sub_after.interval, new_interval, - "interval should be updated" - ); - assert_eq!( - sub_after.last_charged, last_charged_before, - "last_charged must not change" - ); - assert_eq!(sub_after.amount, amount_before, "amount must not change"); - assert!(sub_after.active, "subscription should remain active"); - - // next_charge_at must reflect last_charged + new_interval - let expected_next = last_charged_before + new_interval; - assert_eq!( - client.next_charge_at(&user).unwrap(), - expected_next, - "next_charge_at should use the updated interval" - ); -} - -/// Setting an interval of zero must panic with IntervalMustBePositive. -#[test] -#[should_panic(expected = "Error(Contract, #3)")] -fn test_set_subscription_interval_zero_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_interval(&user, &0); -} - -/// Updating the interval for a non-existent subscription must panic with -/// NoSubscriptionFound. -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_set_subscription_interval_no_subscription_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.set_subscription_interval(&random, &86400); -} - -/// A non-admin caller must not be able to update the billing interval. -#[test] -#[should_panic] -fn test_set_subscription_interval_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.set_auths(&[]); - - client.set_subscription_interval(&user, &172800); -} - -// ───────────────────────────────────────────── -// CONTRACT-38: withdraw_merchant_revenue tests -// ───────────────────────────────────────────── - -/// Merchant with accrued revenue can withdraw the full tracked balance. -/// After withdrawal: token balance increases by the tracked amount and the -/// revenue counter resets to zero. -#[test] -fn test_withdraw_merchant_revenue_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - // Initialize the global token so withdraw can resolve it. - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.initialize(&token_addr, &admin); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - // The tracked revenue equals the net charge (no fee configured in setup). - let tracked = client.get_merchant_revenue(&merchant); - assert!(tracked > 0, "revenue should be positive after charge"); - - // Seed the contract with enough tokens to cover the withdrawal. - // In a pooling model the contract would accumulate these from charges - // routed through it; here we simulate that by minting directly. - sac.mint(&contract_id, &tracked); - - let merchant_balance_before = token.balance(&merchant); - - client.withdraw_merchant_revenue(&merchant); - - // Revenue counter must be reset to zero. - assert_eq!( - client.get_merchant_revenue(&merchant), - 0, - "revenue counter must be reset after withdrawal" - ); - - // Merchant token balance must increase by the tracked amount. - let merchant_balance_after = token.balance(&merchant); - assert_eq!( - merchant_balance_after - merchant_balance_before, - tracked, - "merchant token balance should increase by the withdrawn amount" - ); -} - -/// Withdrawal with no accrued balance must panic with ZeroBalanceAvailable. -#[test] -#[should_panic(expected = "Error(Contract, #21)")] -fn test_withdraw_merchant_revenue_zero_balance_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.initialize(&token_addr, &admin); - - // No charges have occurred, so revenue is zero. - client.withdraw_merchant_revenue(&merchant); -} - -#[test] -fn test_next_charge_at_none_for_paused_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - assert!(client.next_charge_at(&user).is_none()); -} - -#[test] -fn test_is_charge_due_transitions_after_interval() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Before interval elapses: not due - assert!(!client.is_charge_due(&user)); - - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - assert!(client.is_charge_due(&user)); -} - -#[test] -fn test_is_charge_due_false_for_paused_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - assert!(!client.is_charge_due(&user)); -} - -// ───────────────────────────────────────────── -// ───────────────────────────────────────────── -// CONTRACT-53: batch_pause_subscriptions tests -// ───────────────────────────────────────────── - -/// Admin can pause multiple valid subscriptions in a single batch call. -/// The test verifies paused flag is set, events are emitted, and already-paused -/// or missing addresses are handled without disruption. -#[test] -fn test_batch_pause_subscriptions_mixed_inputs() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Set up user_b with a subscription - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - // Set up user_c with a subscription (will be paused first) - let user_c = Address::generate(&env); - sac.mint(&user_c, &10_000_0000000); - token.approve(&user_c, &contract_id, &10_000_0000000, &200); - - // Set up user_d with a subscription (valid, will be paused in batch) - let user_d = Address::generate(&env); - sac.mint(&user_d, &10_000_0000000); - token.approve(&user_d, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_c, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_d, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Pre-pause user_c - client.pause(&user_c); - let sub_c_before = client.get_subscription(&user_c).unwrap(); - assert!(sub_c_before.paused); - - // Verify all others start unpaused - assert!(!client.get_subscription(&user_a).unwrap().paused); - assert!(!client.get_subscription(&user_b).unwrap().paused); - assert!(!client.get_subscription(&user_d).unwrap().paused); - - // Build batch with mixed inputs: valid, missing, already-paused, valid - let no_sub_user = Address::generate(&env); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); // valid → should be paused - users.push_back(no_sub_user.clone()); // no subscription → skipped - users.push_back(user_c.clone()); // already paused → no-op - users.push_back(user_b.clone()); // valid → should be paused - users.push_back(user_d.clone()); // valid → should be paused - - let events_before = env.events().all().len(); - - client.batch_pause_subscriptions(&users); - - // All valid subscriptions must be paused - let sub_a = client.get_subscription(&user_a).unwrap(); - assert!(sub_a.paused, "user_a should be paused"); - - let sub_b = client.get_subscription(&user_b).unwrap(); - assert!(sub_b.paused, "user_b should be paused"); - - let sub_d = client.get_subscription(&user_d).unwrap(); - assert!(sub_d.paused, "user_d should be paused"); - - // Already-paused user_c remains paused - let sub_c = client.get_subscription(&user_c).unwrap(); - assert!(sub_c.paused, "user_c should remain paused"); - - // No subscription was created for no_sub_user - assert!( - client.get_subscription(&no_sub_user).is_none(), - "no_sub_user should have no subscription" - ); - - // Verify events: three subscription_paused events (user_a, user_b, user_d) - let events_after = env.events().all(); - let paused_event_count = (events_before..events_after.len()) - .filter(|&i| { - let (_, topics, _) = events_after.get(i).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - topic_symbol == Symbol::new(&env, "subscription_paused") - }) - .count(); - assert_eq!( - paused_event_count, 3, - "should emit 3 subscription_paused events" - ); -} - -/// Non-admin callers must be rejected with an auth panic. -#[test] -#[should_panic] -fn test_batch_pause_subscriptions_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Clear all auths — admin auth should fail and panic - env.set_auths(&[]); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_pause_subscriptions(&users); -} - -/// Batch size exceeding 25 must panic with BatchTooLarge. -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_pause_subscriptions_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Build a vector with 26 entries - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_admin_batch_cancel_subscriptions_cancels_multiple_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_cancel(&users); - - assert_eq!(results.len(), 2); - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); - assert!(!client.get_subscription(&user_a).unwrap().active); - assert!(!client.get_subscription(&user_b).unwrap().active); - assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); -} - -#[test] -fn test_batch_cancel_matches_single_cancel_side_effects() { - let (env, contract_id, token_addr, user_single, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_batch = setup_funded_user(&env, &contract_id, &token_addr); - let referrer = Address::generate(&env); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user_single, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - client.subscribe( - &user_batch, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer), - ); - - client.cancel(&user_single); - let mut users = Vec::new(&env); - users.push_back(user_batch.clone()); - let results = client.batch_cancel(&users); - - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!( - client.get_subscription(&user_single), - client.get_subscription(&user_batch) - ); - assert_eq!(client.get_referrer(&user_single), None); - assert_eq!(client.get_referrer(&user_batch), None); - assert_eq!(client.get_active_count(), 0); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - assert_eq!(client.get_subscriber_count(), 2); - assert!(client.get_subscriber_at(&0).is_none()); - assert!(client.get_subscriber_at(&1).is_none()); - assert_eq!(count_user_events(&env, "cancelled", &user_single), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_batch), 1); -} - -#[test] -#[should_panic] -fn test_batch_cancel_requires_admin_auth() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let admin = Address::generate(&env); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = Vec::new(&env); - users.push_back(user); - - client.batch_cancel(&users); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_cancel_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - client.batch_cancel(&users); -} - -#[test] -fn test_batch_cancel_at_max_size_succeeds() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..25 { - users.push_back(Address::generate(&env)); - } - - let results = client.batch_cancel(&users); - assert_eq!(results.len(), 25); - for result in results.iter() { - assert_eq!(result, CancelResult::NoSubscription); - } -} - -#[test] -fn test_batch_cancel_handles_mixed_states_and_clears_referral() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let user_c = setup_funded_user(&env, &contract_id, &token_addr); - let missing_user = Address::generate(&env); - let referrer = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user_b); - client.subscribe( - &user_c, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user_c); - - assert_eq!(client.get_referrer(&user_a), Some(referrer)); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - users.push_back(user_c.clone()); - users.push_back(missing_user.clone()); - - let results = client.batch_cancel(&users); - - assert_eq!(results.len(), 4); - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(2).unwrap(), CancelResult::AlreadyCancelled); - assert_eq!(results.get(3).unwrap(), CancelResult::NoSubscription); - - assert!(!client.get_subscription(&user_a).unwrap().active); - assert!(!client.get_subscription(&user_b).unwrap().active); - assert!(!client.get_subscription(&user_c).unwrap().active); - assert!(client.get_subscription(&missing_user).is_none()); - - assert_eq!(client.get_referrer(&user_a), None); - assert_eq!(client.get_active_count(), 0); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - assert_eq!(client.get_subscriber_count(), 3); - assert!(client.get_subscriber_at(&0).is_none()); - assert!(client.get_subscriber_at(&1).is_none()); - assert!(client.get_subscriber_at(&2).is_none()); - - assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_c), 1); -} - -// ───────────────────────────────────────────── -// CONTRACT-07: get_merchant_sub_count tests -// ───────────────────────────────────────────── - -#[test] -fn test_merchant_sub_count_two_users_cancel_one() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 2); - - client.cancel(&user_a); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); -} - -#[test] -fn test_merchant_sub_count_resubscribe_different_merchant() { - let (env, contract_id, token_addr, user, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - // Subscribe user to merchant A - client.subscribe( - &user, - &merchant_a, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant_a), 1); - assert_eq!(client.get_merchant_sub_count(&merchant_b), 0); - - // Re-subscribe user to merchant B - client.subscribe( - &user, - &merchant_b, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant_a), 0); - assert_eq!(client.get_merchant_sub_count(&merchant_b), 1); -} - -#[test] -fn test_merchant_sub_count_never_subscribed_returns_zero() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let unknown_merchant = Address::generate(&env); - assert_eq!(client.get_merchant_sub_count(&unknown_merchant), 0); -} - -#[test] -fn test_merchant_sub_count_double_cancel_no_underflow() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - - client.cancel(&user); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - - // Second cancel must not underflow - client.cancel(&user); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); -} - -#[test] -fn test_is_charge_due_false_past_grace_window() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let interval: u64 = 86400; - let grace: u64 = 3600; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.propose_grace_period(&grace); - client.commit_grace_period(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + grace + 1; - }); - - assert!(!client.is_charge_due(&user)); -} - -#[test] -fn test_is_charge_due_false_for_unknown_address() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert!(!client.is_charge_due(&Address::generate(&env))); -} - -#[test] -fn test_daily_limit_day_start_boundary() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &100_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - // Spend 10 - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 10_0000000); - - // Spend 10 more - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 20_0000000); - - // Manually extend DailyLimit (and other entries touched by the upcoming pay_per_use) - // TTL so they survive the time skip below. - env.as_contract(&contract_id, || { - let key = DataKey::DailyLimit(user.clone()); - // 35,000 ledgers > LEDGERS_PER_DAY (17,280) - env.storage().temporary().extend_ttl(&key, 35000, 35000); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenue(merchant.clone()), - 35000, - 35000, - ); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenueHistory(merchant.clone()), - 35000, - 35000, - ); - }); - - // Advance sequence by LEDGERS_PER_DAY + 1 to expire DayStart (17,280 + 1 = 17,281) - env.ledger().with_mut(|l| { - l.sequence_number += 17281; - l.timestamp += 17281 * 5; - }); - - // Renew the token allowance, which expired when the ledger sequence jumped past it - let token = TokenClient::new(&env, &token_addr); - token.approve( - &user, - &contract_id, - &10_000_0000000, - &(env.ledger().sequence() + 200), - ); - - // New spend on new day - client.pay_per_use(&user, &15_0000000); - - // Should only be 15, not 35 - assert_eq!(client.get_daily_spent(&user), 15_0000000); -} - -// ───────────────────────────────────────────── -// CONTRACT-821: simulate_pay_per_use dry-run helper -// ───────────────────────────────────────────── - -/// The sibling dry-run of `pay_per_use` returns distinct outcomes for the -/// inactive, paused, would-succeed, and daily-limit cases, while performing no -/// state writes. -#[test] -fn test_simulate_pay_per_use_variants() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Inactive when no subscription - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::Inactive - ); - - // Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. WouldSucceed when active, no daily limit, allowance sufficient - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::WouldSucceed - ); - - // 3. DailyLimitExceeded when the limit would be exceeded - client.set_daily_limit(&user, &5_0000000); - assert_eq!( - client.simulate_pay_per_use(&user, &6_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // 4. DailyLimitExceeded on cumulative spend: 3, then simulate another 3 (>5) - client.pay_per_use(&user, &3_0000000); - assert_eq!( - client.simulate_pay_per_use(&user, &3_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // 5. SubscriptionPaused when paused - let before_spent = client.get_daily_spent(&user); - client.pause(&user); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::SubscriptionPaused - ); - client.resume(&user); - - // 6. InsufficientAllowance when allowance revoked - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &100); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::InsufficientAllowance - ); - - // 7. ContractPaused - env.as_contract(&contract_id, || { - storage::set_contract_paused(&env, true); - }); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::ContractPaused - ); - - // No simulation wrote to daily spend tracking. - assert_eq!(client.get_daily_spent(&user), before_spent); -} - -/// `simulate_pay_per_use` performs no state writes: daily spent, day start, and -/// balance are unchanged regardless of the simulated outcome. -#[test] -fn test_simulate_pay_per_use_no_state_writes() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - - client.pay_per_use(&user, &2_0000000); - - let spent_before = client.get_daily_spent(&user); - let day_start_before = client.get_day_start(&user); - let balance_before = TokenClient::new(&env, &token_addr) - .balance(&user); - - // Would succeed - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::WouldSucceed - ); - // Limit exceeded - assert_eq!( - client.simulate_pay_per_use(&user, &5_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - assert_eq!(client.get_daily_spent(&user), spent_before); - assert_eq!(client.get_day_start(&user), day_start_before); - assert_eq!( - TokenClient::new(&env, &token_addr).balance(&user), - balance_before - ); -} - -/// Simulating a spend at a day-window boundary reflects the fresh (reset) daily -/// spent value after the window has elapsed, mirroring `pay_per_use`. -#[test] -fn test_simulate_pay_per_use_day_window_reset_boundary() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &100_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - // Spend 10 today. - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 10_0000000); - - // Crossing the day boundary makes the reset daily spent visible to the - // dry-run: today a 45 spend would exceed (10 + 45 > 50)... - assert_eq!( - client.simulate_pay_per_use(&user, &45_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // Manually extend the DailyLimit (and merchant-revenue) TTL so they survive - // the time skip below, while intentionally leaving DailySpent/DayStart to - // expire so the new window starts from a reset counter. - env.as_contract(&contract_id, || { - let key = DataKey::DailyLimit(user.clone()); - env.storage().temporary().extend_ttl(&key, 35000, 35000); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenue(merchant.clone()), - 35000, - 35000, - ); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenueHistory(merchant.clone()), - 35000, - 35000, - ); - }); - - // Advance past the day window (LEDGERS_PER_DAY + 1). - env.ledger().with_mut(|l| { - l.sequence_number += 17281; - l.timestamp += 17281 * 5; - }); - - // Renew the token allowance that expired with the ledger jump. - let token = TokenClient::new(&env, &token_addr); - token.approve( - &user, - &contract_id, - &10_000_0000000, - &(env.ledger().sequence() + 200), - ); - - // The new day's simulated spend is evaluated against a reset counter, - // so the same 45 amount now succeeds. - assert_eq!( - client.simulate_pay_per_use(&user, &45_0000000), - PayPerUseSimResult::WouldSucceed - ); -} - -/// `simulate_pay_per_use_to` accounts for recipient validation (invalid -/// contract self-reference and merchant whitelist) in addition to the shared -/// pay-per-use checks. -#[test] -fn test_simulate_pay_per_use_to_recipient_validation() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Contract's own address is an invalid recipient. - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &contract_id), - PayPerUseSimResult::InvalidRecipient - ); - - // With whitelist enabled, a non-whitelisted recipient is rejected. - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, true); - }); - let random = Address::generate(&env); - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &random), - PayPerUseSimResult::MerchantNotWhitelisted - ); - - // A valid, whitelisted recipient would succeed. - env.as_contract(&contract_id, || { - whitelist::add_merchant(&env, &merchant); - }); - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &merchant), - PayPerUseSimResult::WouldSucceed - ); -} - -/// `simulate_pay_per_use` rejects non-positive and over-cap amounts with the -/// same outcomes the real call enforces. -#[test] -fn test_simulate_pay_per_use_amount_bounds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No subscription yet, but amount bounds are checked before subscription. - assert_eq!( - client.simulate_pay_per_use(&user, &0), - PayPerUseSimResult::AmountMustBePositive - ); - assert_eq!( - client.simulate_pay_per_use(&user, &(MAX_AMOUNT + 1)), - PayPerUseSimResult::AmountExceedsMaximum - ); -} - -// ───────────────────────────────────────────── -// New Feature Unit Tests (Issues #628, #638, #640, #641) -// ───────────────────────────────────────────── - -#[test] -fn test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown() { - let (env, contract_id, token_addr, user1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user2 = Address::generate(&env); - let user3_unknown = Address::generate(&env); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user2, &contract_id, &1_000_000_000, &100); - - client.subscribe( - &user1, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user2, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user1.clone()); - users.push_back(user2.clone()); - users.push_back(user3_unknown.clone()); - - let extended = client.batch_extend_subscription_ttl(&users); - assert_eq!(extended.len(), 2); - assert_eq!(extended.get(0).unwrap(), user1); - assert_eq!(extended.get(1).unwrap(), user2); -} - -#[test] -#[should_panic] -fn test_batch_extend_subscription_ttl_over_limit_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - users.push_back(Address::generate(&env)); - } - - client.batch_extend_subscription_ttl(&users); -} - -#[test] -fn test_simulate_charge_variants() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Inactive when no subscription - assert_eq!(client.simulate_charge(&user), ChargeSimResult::Inactive); - - // Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. NotDue immediately after subscribe - assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); - - // Advance time past interval - env.ledger().with_mut(|l| { - l.timestamp += 86401; - }); - - // 3. WouldSucceed when due and allowed - assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); - - // 4. InsufficientAllowance when allowance revoked - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &100); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::InsufficientAllowance - ); - - // Restore allowance - token.approve(&user, &contract_id, &1_000_000_000, &100); - - // 5. SubscriptionPaused when paused - client.pause(&user); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::SubscriptionPaused - ); - - // Resume - client.resume(&user); - - // 6. GracePeriodElapsed - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::GracePeriod, &3600u64); - }); - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 3601; - }); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::GracePeriodElapsed - ); - - // 7. ContractPaused - env.as_contract(&contract_id, || { - storage::set_contract_paused(&env, true); - }); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::ContractPaused - ); -} - -#[test] -fn test_get_schema_version_returns_zero_and_updates() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_schema_version(), 0); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - assert_eq!(client.get_schema_version(), 3); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_contract_address_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.pay_per_use_to(&user, &1_0000000, &contract_id); -} - -#[test] -fn test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 4_0000000; - let recipient_before = token.balance(&recipient); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&recipient) - recipient_before, amount); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #634: get_merchant_revenue_summary -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_merchant_revenue_summary_empty() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let summary = client.get_merchant_revenue_summary(&merchant); - assert_eq!(summary, (0, 0, 0, 0)); -} - -#[test] -fn test_merchant_revenue_summary_single_and_multiple_charges() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 10_0000000; - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - client.pay_per_use(&user, &amount); - - // First charge recorded: 10_0000000 - let summary1 = client.get_merchant_revenue_summary(&merchant); - assert_eq!(summary1, (amount, 1, amount, amount)); - - // Additional pay_per_use calls with different amounts - client.pay_per_use(&user, &5_0000000); - client.pay_per_use(&user, &25_0000000); - - let summary2 = client.get_merchant_revenue_summary(&merchant); - // total = 10 + 5 + 25 = 40_0000000 - // count = 3 - // min = 5_0000000 - // max = 25_0000000 - assert_eq!(summary2, (40_0000000, 3, 5_0000000, 25_0000000)); -} - -#[test] -fn test_merchant_revenue_summary_cleared_history() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &10_0000000); - client.clear_merchant_revenue_history(&merchant); - - let summary = client.get_merchant_revenue_summary(&merchant); - // History cleared -> total remains 10_0000000, count/min/max return 0 - assert_eq!(summary, (10_0000000, 0, 0, 0)); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #635: get_subscription_health -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_subscription_health_non_existent_user() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let unknown = Address::generate(&env); - - let health = client.get_subscription_health(&unknown); - assert_eq!( - health, - SubscriptionHealth { - active: false, - charge_due: false, - within_grace: false, - has_sufficient_allowance: false, - is_paused: false, - trial_active: false, - daily_limit_set: false, - } - ); -} - -#[test] -fn test_subscription_health_active_healthy() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let health = client.get_subscription_health(&user); - assert_eq!(health.active, true); - assert_eq!(health.charge_due, false); - assert_eq!(health.within_grace, false); - assert_eq!(health.has_sufficient_allowance, true); - assert_eq!(health.is_paused, false); - assert_eq!(health.trial_active, false); - assert_eq!(health.daily_limit_set, false); -} - -#[test] -fn test_subscription_health_paused() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let health = client.get_subscription_health(&user); - assert_eq!(health.active, true); - assert_eq!(health.is_paused, true); - assert_eq!(health.charge_due, false); -} - -#[test] -fn test_subscription_health_trial_active() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let trial_sec = 7 * 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &Some(trial_sec), - &None, - ); - - let health = client.get_subscription_health(&user); - assert_eq!(health.trial_active, true); -} - -#[test] -fn test_subscription_health_grace_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.propose_grace_period(&86400); - client.commit_grace_period(); - - let interval = 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Fast-forward ledger past interval, into grace period window - env.ledger().set(soroban_sdk::testutils::LedgerInfo { - timestamp: env.ledger().timestamp() + interval + 3600, - protocol_version: 20, - sequence_number: 100, - network_id: [0u8; 32], - base_reserve: 10, - min_temp_entry_ttl: 16, - min_persistent_entry_ttl: 16, - max_entry_ttl: 3110400, - }); - - let health = client.get_subscription_health(&user); - assert_eq!(health.charge_due, true); - assert_eq!(health.within_grace, true); -} - -#[test] -fn test_subscription_health_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Revoke allowance - token.approve(&user, &contract_id, &0, &1000); - - let health = client.get_subscription_health(&user); - assert_eq!(health.has_sufficient_allowance, false); -} - -#[test] -fn test_subscription_health_daily_limit_set() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - let health = client.get_subscription_health(&user); - assert_eq!(health.daily_limit_set, true); -} - -/// set_initial_admin with proper auth when Admin is unset succeeds and stores admin. -#[test] -fn test_set_initial_admin_success_once() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_admin().is_none()); - client.set_initial_admin(&admin); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// A second set_initial_admin call must return typed AdminAlreadySet (code 42), -/// not a raw string panic, and must not change the stored admin. -#[test] -fn test_set_initial_admin_second_call_returns_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin1 = Address::generate(&env); - let admin2 = Address::generate(&env); - - client.set_initial_admin(&admin1); - assert_eq!(client.get_admin(), Some(admin1.clone())); - - let result = client.try_set_initial_admin(&admin2); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "second set_initial_admin must map to ContractError::AdminAlreadySet" - ); - - // First admin is unchanged — no partial overwrite. - assert_eq!(client.get_admin(), Some(admin1)); -} - -/// Calling set_initial_admin without the proposed admin's auth must fail with an -/// authorization error (host-level, not a contract-level typed error) and must -/// not write the admin slot. -#[test] -fn test_set_initial_admin_unauthenticated_fails() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.set_auths(&[]); - - let result = client.try_set_initial_admin(&admin); - assert!( - result.is_err(), - "set_initial_admin without proposed admin auth must fail" - ); - assert_ne!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "missing auth must be an authorization failure, not AdminAlreadySet" - ); - - assert!( - client.get_admin().is_none(), - "failed set_initial_admin must not persist admin" - ); -} - -/// Partial-init edge case: Token is already stored (e.g. from a separate -/// deploy-step) but Admin slot is still empty. set_initial_admin must still -/// require auth, succeed, and not be confused with initialize's state. -#[test] -fn test_set_initial_admin_token_present_admin_missing() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - // Simulate partial init: write Token but not Admin. - env.as_contract(&contract_id, || { - storage::set_token(&env, &token_addr); - }); - - // Sanity: token stored, admin missing. - assert_eq!(client.get_token(), Some(token_addr.clone())); - assert!(client.get_admin().is_none()); - - // set_initial_admin must still require auth and succeed. - client.set_initial_admin(&admin); - assert_eq!(client.get_admin(), Some(admin.clone())); - // Token state untouched. - assert_eq!(client.get_token(), Some(token_addr)); - - // Subsequent call returns typed error (not a panic) even in partial-init - // post-success state. - let admin2 = Address::generate(&env); - let result = client.try_set_initial_admin(&admin2); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "post-success second call must return AdminAlreadySet in partial-init scenario" - ); - assert_eq!(client.get_admin(), Some(admin)); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #636: validate_interval hardening -// ───────────────────────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #3)")] -fn test_subscribe_interval_zero_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &10_0000000, &0, &token_addr, &None, &None); -} - -#[test] -#[should_panic(expected = "Error(Contract, #19)")] -fn test_set_subscription_interval_below_min_interval_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Setting interval to 100 seconds when MinInterval is default 3600 panics with #19 (IntervalTooShort) - client.set_subscription_interval(&user, &100); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #637: WhitelistIndex & pagination -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_whitelist_index_size_page_and_swap_remove() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert_eq!(client.get_whitelist_size(), 0); - assert_eq!(client.get_whitelist_page(&0, &10).len(), 0); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - - client.add_merchant(&m1); - client.add_merchant(&m2); - client.add_merchant(&m3); - - // Idempotent double add does not increment index size - client.add_merchant(&m2); - - assert_eq!(client.get_whitelist_size(), 3); - - let page_all = client.get_whitelist_page(&0, &10); - assert_eq!(page_all.len(), 3); - assert_eq!(page_all.get(0).unwrap(), m1); - assert_eq!(page_all.get(1).unwrap(), m2); - assert_eq!(page_all.get(2).unwrap(), m3); - - // Test pagination offset & limit - let page_subset = client.get_whitelist_page(&1, &1); - assert_eq!(page_subset.len(), 1); - assert_eq!(page_subset.get(0).unwrap(), m2); - - // Remove middle item (m2) -> swap-remove moves m3 into index 1 - client.remove_merchant(&m2); - assert_eq!(client.get_whitelist_size(), 2); - - let page_after_remove = client.get_whitelist_page(&0, &10); - assert_eq!(page_after_remove.len(), 2); - assert_eq!(page_after_remove.get(0).unwrap(), m1); - assert_eq!(page_after_remove.get(1).unwrap(), m3); - - // Idempotent double remove does nothing - client.remove_merchant(&m2); - assert_eq!(client.get_whitelist_size(), 2); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #2)")] -fn test_subscription_amount_validation_zero() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - // Attempt to set amount to 0 (panics with AmountMustBePositive, error 19) - env.mock_all_auths(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_amount(&user, &0); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #15)")] -fn test_subscription_amount_validation_exceeds_max() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - // Attempt to set amount above MAX_SUBSCRIPTION_AMOUNT - env.mock_all_auths(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_amount(&user, &(crate::MAX_SUBSCRIPTION_AMOUNT + 1)); -} - -#[test] -fn test_batch_charge_estimate() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let users = soroban_sdk::vec![&env, user.clone()]; - let estimate = client.get_batch_charge_estimate(&users); - - assert_eq!(estimate.len(), 1); - assert_eq!( - estimate.get(0).unwrap(), - crate::batch::ChargeResult::NoSubscription - ); -} - -#[test] -fn test_contract_config() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let config = client.get_contract_config(); - assert_eq!(config.schema_version, 1); - assert_eq!(config.paused, false); -} - -#[test] -fn test_daily_spent_reset() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - assert!(client.get_day_start(&user).is_none()); -} - -// ───────────────────────────────────────────────────────────── -// Issue #11: extend_subscriber_index_ttl tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_extend_subscriber_index_ttl_empty_index_noop() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert_eq!(client.get_subscriber_count(), 0); - client.extend_subscriber_index_ttl(); - assert_eq!(client.get_subscriber_count(), 0); -} - -#[test] -fn test_extend_subscriber_index_ttl_emits_event_with_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_count(), 2); - - client.extend_subscriber_index_ttl(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let count: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!( - topic_symbol, - Symbol::new(&env, "subscriber_index_ttl_extended") - ); - assert_eq!(count, 2); -} - -#[test] -fn test_extend_subscriber_index_ttl_extends_large_index() { - use soroban_sdk::testutils::storage::Persistent as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - for _ in 0..5 { - let u = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe(&u, &merchant, &1_0000000, &86400, &token_addr, &None, &None); - users.push_back(u); - } - - assert_eq!(client.get_subscriber_count(), 5); - - client.extend_subscriber_index_ttl(); - - let events = env.events().all(); - let (_, _, data) = events.get(events.len() - 1).unwrap(); - let count: u64 = data.try_into_val(&env).unwrap(); - assert_eq!(count, 5); - - env.as_contract(&contract_id, || { - let ttl = env - .storage() - .persistent() - .get_ttl(&DataKey::SubscriberIndexSize); - assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS); - - let ttl_0 = env - .storage() - .persistent() - .get_ttl(&DataKey::SubscriberIndex(0)); - assert!(ttl_0 >= SUBSCRIPTION_TTL_LEDGERS); - }); -} - -#[test] -#[should_panic] -fn test_extend_subscriber_index_ttl_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.extend_subscriber_index_ttl(); -} - -// ───────────────────────────────────────────────────────────── -// Issue #838: clear_subscriber_index_entry admin repair -// ───────────────────────────────────────────────────────────── - -/// Simulate a stale index slot: the subscription is inactive but the -/// append-only index was never tombstoned (the corruption this repair -/// entrypoint is meant to fix). -fn deactivate_subscription_leaving_index(env: &Env, contract_id: &Address, user: &Address) { - env.as_contract(contract_id, || { - let mut sub = storage::get_subscription(env, user).expect("subscription"); - sub.active = false; - storage::set_subscription(env, user, &sub); - }); -} - -#[test] -fn test_clear_subscriber_index_entry_authorized_repair_tombstones_stale_slot() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_at(&0u64), Some(user.clone())); - - deactivate_subscription_leaving_index(&env, &contract_id, &user); - assert_eq!( - client.get_subscriber_at(&0u64), - Some(user.clone()), - "stale slot must still be visible before repair" - ); - - client.clear_subscriber_index_entry(&0u64); - - assert_eq!( - client.get_subscriber_at(&0u64), - None, - "repaired slot must be tombstoned" - ); - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 0); - assert_eq!( - client.get_subscriber_count(), - 1, - "repair must not shrink the append-only index" - ); -} - -#[test] -#[should_panic] -fn test_clear_subscriber_index_entry_unauthorized_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - deactivate_subscription_leaving_index(&env, &contract_id, &user); - - env.set_auths(&[]); - client.clear_subscriber_index_entry(&0u64); -} - -#[test] -#[should_panic(expected = "Error(Contract, #41)")] -fn test_clear_subscriber_index_entry_refuses_active_subscriber() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.clear_subscriber_index_entry(&0u64); -} - -#[test] -fn test_clear_subscriber_index_entry_emits_audit_event() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - deactivate_subscription_leaving_index(&env, &contract_id, &user); - - client.clear_subscriber_index_entry(&0u64); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let index: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!( - topic_symbol, - Symbol::new(&env, "subscriber_index_cleared") - ); - assert_eq!(topic_user, user); - assert_eq!(index, 0); -} - -// ───────────────────────────────────────────────────────────── -// Issue #610: get_subscription_token tests -// ───────────────────────────────────────────────────────────── - -/// get_subscription_token returns None before the user subscribes. -#[test] -fn test_get_subscription_token_none_before_subscribe() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!( - client.get_subscription_token(&random).is_none(), - "get_subscription_token should return None for a user with no subscription" - ); -} - -/// get_subscription_token returns Some(token) after subscribe. -#[test] -fn test_get_subscription_token_some_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!( - client.get_subscription_token(&user), - Some(token_addr), - "get_subscription_token should return Some(token) after subscribe" - ); -} - -/// get_subscription_token still returns Some(token) after cancel — the record -/// exists but is inactive; callers that need to distinguish active vs cancelled -/// should use get_subscription instead. -#[test] -fn test_get_subscription_token_some_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - // The subscription record still exists (active=false), so token is still readable. - assert_eq!( - client.get_subscription_token(&user), - Some(token_addr), - "get_subscription_token should return Some(token) for cancelled subscription" - ); -} - -/// get_subscription_token reflects the token when the user re-subscribes with -/// a different token. -#[test] -fn test_get_subscription_token_updates_on_resubscribe() { - let (env, contract_id, token_a, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, &merchant, &1_0000000, &86400, &token_a, &None, &None, - ); - assert_eq!(client.get_subscription_token(&user), Some(token_a.clone())); - - let token_b = setup_second_token(&env, &contract_id, &user); - client.subscribe( - &user, &merchant, &2_0000000, &86400, &token_b, &None, &None, - ); - - assert_eq!( - client.get_subscription_token(&user), - Some(token_b), - "get_subscription_token should return the latest token after resubscribe" - ); -} - -// ───────────────────────────────────────────────────────────── -// Issue #611: propose_fee / commit_fee two-step tests -// ───────────────────────────────────────────────────────────── - -/// Full propose → commit flow sets the fee collector and bps. -#[test] -fn test_propose_and_commit_fee_sets_fee() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &250); - client.commit_fee(); - - let result = client.get_fee(); - assert!(result.is_some()); - let (stored_collector, stored_bps) = result.unwrap(); - assert_eq!(stored_collector, collector); - assert_eq!(stored_bps, 250); -} - -/// propose_fee emits a fee_proposed event. -#[test] -fn test_propose_fee_emits_fee_proposed_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &100); - - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "fee_proposed")); -} - -/// commit_fee emits a fee_committed event. -#[test] -fn test_commit_fee_emits_fee_committed_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &50); - client.commit_fee(); - - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); -} - -/// commit_fee without a prior propose panics with NoPendingProposal (#23). -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_commit_fee_without_proposal_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.commit_fee(); -} - -/// propose_fee with bps > 10000 panics with InvalidFeeBps (#13). -#[test] -#[should_panic(expected = "Error(Contract, #13)")] -fn test_propose_fee_invalid_bps_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &10_001); -} - -/// A re-propose before commit replaces the pending fee — commit applies -/// the latest proposal. -#[test] -fn test_repropose_before_commit_applies_latest() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector_a = Address::generate(&env); - let collector_b = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector_a, &100); - // Re-propose with different values before committing - client.propose_fee(&collector_b, &200); - client.commit_fee(); - - let (stored_collector, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_collector, collector_b); - assert_eq!(stored_bps, 200); -} - -/// After commit_fee, committing again without a new propose panics. -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_double_commit_without_repropose_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &100); - client.commit_fee(); - // Second commit without a new propose must panic - client.commit_fee(); -} - -/// Bps of exactly 10000 (100%) is valid at both propose and commit. -#[test] -fn test_propose_fee_max_valid_bps() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &10_000); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 10_000); -} - -/// Bps of 0 is valid (disabling the fee while keeping the collector). -#[test] -fn test_propose_fee_zero_bps_valid() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &0); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 0); -} - -/// Non-admin calling propose_fee panics. -#[test] -#[should_panic] -fn test_propose_fee_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin set; require_admin call inside propose_fee should panic. - // NOTE: propose_fee in lib.rs calls bump_instance_ttl then fee::propose_fee. - // fee::propose_fee itself does not require_admin — the admin guard - // is the caller's responsibility in lib.rs. We verify the whole - // public entry point panics when no admin is configured. - let collector = Address::generate(&env); - - // Explicitly set an admin so admin check works, then revoke auths. - client.propose_fee(&collector, &100); -} - -// ───────────────────────────────────────────── -// Issue 012: commit_fee bounds re-validation -// ───────────────────────────────────────────── - -/// commit_fee rejects when bounds tightened after propose (bps above new max). -#[test] -#[should_panic(expected = "Error(Contract, #35)")] -fn test_commit_fee_rejects_when_bounds_tightened_above_max() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Propose 500 bps — within default bounds (0, 10000) - client.propose_fee(&collector, &500); - - // Tighten max to 200 bps before commit - client.set_fee_bounds(&0, &200); - - // Commit should reject 500 bps against new [0, 200] bounds - client.commit_fee(); -} - -/// commit_fee rejects when bounds tightened after propose (bps below new min). -#[test] -#[should_panic(expected = "Error(Contract, #35)")] -fn test_commit_fee_rejects_when_bounds_tightened_below_min() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Propose 50 bps - client.propose_fee(&collector, &50); - - // Raise min to 100 bps before commit - client.set_fee_bounds(&100, &10000); - - // Commit should reject 50 bps against new [100, 10000] bounds - client.commit_fee(); -} - -/// commit_fee succeeds when pending bps are within current bounds. -#[test] -fn test_commit_fee_succeeds_when_within_bounds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.set_fee_bounds(&10, &500); - client.propose_fee(&collector, &200); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 200); -} - -/// commit_fee succeeds when no bounds are configured (defaults to 0..10000). -#[test] -fn test_commit_fee_succeeds_with_default_bounds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // No set_fee_bounds call — defaults to (0, 10000) - client.propose_fee(&collector, &750); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 750); -} - -// ───────────────────────────────────────────── -// Batch queries tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_merchant_statuses_empty() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchants = soroban_sdk::Vec::new(&env); - let result = client.get_merchant_statuses(&merchants); - assert_eq!(result.len(), 0); -} - -#[test] -fn test_get_merchant_statuses_mixed() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); -} - -// Issue #9: validate_recipient_address tests -// ───────────────────────────────────────────── - -/// set_fee() with a valid (non-contract) collector address must succeed. -#[test] -fn test_validate_recipient_address_valid_passes() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - // Must not panic — a regular address is a valid fee collector. - client.propose_fee(&collector, &100u32); - client.commit_fee(); - - assert_eq!(client.get_fee(), Some((collector, 100u32))); -} - -/// set_fee() with the contract's own address as collector must panic with -/// ContractError::InvalidFeeCollector (error code 26). -#[test] -#[should_panic(expected = "Error(Contract, #26)")] -fn test_validate_recipient_address_contract_self_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Passing the contract address as fee collector must be rejected. - client.propose_fee(&contract_id, &100u32); - client.commit_fee(); -} -// ───────────────────────────────────────────────────────────── -// Issue #3: Per-Merchant Fee Recipient Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_set_and_get_merchant_fee_recipient() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_merchant_fee_recipient(&merchant), None); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - assert_eq!( - client.get_merchant_fee_recipient(&merchant), - Some(custom_recipient) - ); -} - -#[test] -fn test_set_merchant_fee_recipient_contract_address_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let res = client.try_set_merchant_fee_recipient(&merchant, &contract_id); - assert!(res.is_err()); -} - -#[test] -fn test_merchant_fee_recipient_routing_and_fallback() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let global_collector = Address::generate(&env); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.propose_fee(&global_collector, &100); - client.commit_fee(); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - env.ledger().set_timestamp(86400); - client.charge(&user); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 990); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - env.ledger().set_timestamp(172800); - client.charge(&user); - assert_eq!(token.balance(&custom_recipient), 10); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 1980); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_merchant_statuses_exceeds_limit_panics() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut merchants = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - merchants.push_back(Address::generate(&env)); - } - client.get_merchant_statuses(&merchants); -} - -#[test] -fn test_get_next_charge_batch_empty_and_bounds() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let batch = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch.len(), 0); - - let batch_oob = client.get_next_charge_batch(&5, &10, &None); - assert_eq!(batch_oob.len(), 0); -} - -#[test] -fn test_get_next_charge_batch_filtering() { - let (env, contract_id, token_addr, user_due, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_not_due = setup_funded_user(&env, &contract_id, &token_addr); - let user_paused = setup_funded_user(&env, &contract_id, &token_addr); - let user_cancelled = setup_funded_user(&env, &contract_id, &token_addr); - - let interval: u64 = 86400; - - client.subscribe(&user_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user_paused, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user_cancelled, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - client.pause(&user_paused); - client.cancel(&user_cancelled); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.subscribe(&user_not_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - let batch = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch.len(), 1); - assert_eq!(batch.get(0).unwrap(), user_due); -} - -#[test] -fn test_get_next_charge_batch_pagination() { - let (env, contract_id, token_addr, user1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user2 = setup_funded_user(&env, &contract_id, &token_addr); - let user3 = setup_funded_user(&env, &contract_id, &token_addr); - - let interval: u64 = 86400; - - client.subscribe(&user1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user3, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let batch1 = client.get_next_charge_batch(&0, &2, &None); - assert_eq!(batch1.len(), 2); - assert_eq!(batch1.get(0).unwrap(), user1); - assert_eq!(batch1.get(1).unwrap(), user2); - - let batch2 = client.get_next_charge_batch(&2, &2, &None); - assert_eq!(batch2.len(), 1); - assert_eq!(batch2.get(0).unwrap(), user3); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_next_charge_batch_exceeds_limit_panics() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.get_next_charge_batch(&0, &51, &None); -} - -#[test] -fn test_get_next_charge_batch_exclude_lapsed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - let grace_period: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Advance ledger beyond interval, but WITHIN grace period - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period - 100; - }); - - // It should be returned because it's due and not lapsed - let batch = client.get_next_charge_batch(&0, &10, &Some(true)); - assert_eq!(batch.len(), 1); - assert_eq!(batch.get(0).unwrap(), user); - - // Advance ledger beyond interval + grace period - env.ledger().with_mut(|l| { - l.timestamp += 200; // past the grace period - }); - - // When exclude_lapsed is Some(true) or None, it should NOT be returned - let batch_exclude = client.get_next_charge_batch(&0, &10, &Some(true)); - assert_eq!(batch_exclude.len(), 0); - - let batch_default = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch_default.len(), 0); - - // When exclude_lapsed is Some(false), it should be returned - let batch_include = client.get_next_charge_batch(&0, &10, &Some(false)); - assert_eq!(batch_include.len(), 1); - assert_eq!(batch_include.get(0).unwrap(), user); -} - -#[test] -fn test_merchant_fee_recipient_routes_pay_per_use_and_falls_back() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let global_collector = Address::generate(&env); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&global_collector, &100); - client.commit_fee(); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pay_per_use(&user, &1000); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 990); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - client.pay_per_use(&user, &1000); - assert_eq!(token.balance(&custom_recipient), 10); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 1980); -} - -// ───────────────────────────────────────────────────────────── -// Issue #4: Bounded Pause with Auto-Resume Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_pause_until_auto_resume_on_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pause_until(&user, &90000); - - env.ledger().set_timestamp(86400); - let res = client.try_charge(&user); - assert!(res.is_err()); - - env.ledger().set_timestamp(90000); - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - assert_eq!(token.balance(&merchant), 1000); -} - -#[test] -fn test_pause_until_invalid_expiry_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - env.ledger().set_timestamp(200000); - let res = client.try_pause_until(&user, &200000); - assert!(res.is_err()); - let res2 = client.try_pause_until(&user, &150000); - assert!(res2.is_err()); -} - -#[test] -fn test_resume_clears_pause_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pause_until(&user, &300000); - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - - env.as_contract(&contract_id, || { - let pause_expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(pause_expiry, None); - }); -} - -#[test] -fn test_pause_until_auto_resume_on_batch_charge_and_clears_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - env.ledger().set_timestamp(90000); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let result = client.batch_charge(&users); - assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - - env.as_contract(&contract_id, || { - let pause_expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(pause_expiry, None); - }); -} - -// ───────────────────────────────────────────────────────────── -// Issue #5: get_referral Read Function Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_get_referral_lifecycle() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let referrer = Address::generate(&env); - - assert_eq!(client.get_referral(&user), None); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referral(&user), Some(referrer.clone())); - - client.cancel(&user); - assert_eq!(client.get_referral(&user), None); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referral(&user), Some(referrer)); -} - -// ───────────────────────────────────────────────────────────── -// Issue #6: Storage Migration v3 Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_migration_v2_to_v3_populates_referrer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let referrer = Address::generate(&env); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &2u32); - }); - - assert_eq!(client.get_schema_version(), 2); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - client.migrate(&users); - - assert_eq!(client.get_schema_version(), 3); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.referrer, Some(referrer)); - - client.migrate(&users); - assert_eq!(client.get_schema_version(), 3); -} - -// ───────────────────────────────────────────────────────────── -// Issue 011: ChargeResult discriminant stability (golden tests) -// ───────────────────────────────────────────────────────────── -// -// Off-chain parsers (keepers, alert-failed-charges.ts, indexers) -// decode ChargeResult by variant index. These tests lock the -// discriminant layout so a reorder or rename is caught in CI. - -/// The number of ChargeResult variants. If you add a new variant, -/// update this count AND append the new variant at the end of the enum. -#[test] -fn test_charge_result_variant_count() { - let env = Env::default(); - let _ = env.register_contract(None, FlowPay); - - // Encode each variant via IntoVal and verify they produce distinct values. - // This also serves as a compile-time check: if a variant is removed or - // renamed, this test won't compile (exhaustive pattern match). - let charged: soroban_sdk::Val = ChargeResult::Charged.into_val(&env); - let skipped: soroban_sdk::Val = ChargeResult::Skipped.into_val(&env); - let no_sub: soroban_sdk::Val = ChargeResult::NoSubscription.into_val(&env); - let inactive: soroban_sdk::Val = ChargeResult::Inactive.into_val(&env); - let paused: soroban_sdk::Val = ChargeResult::Paused.into_val(&env); - let grace: soroban_sdk::Val = ChargeResult::GracePeriodElapsed.into_val(&env); - - // All variants must encode to distinct raw values - let c = unsafe { core::mem::transmute::(charged) }; - let s = unsafe { core::mem::transmute::(skipped) }; - let n = unsafe { core::mem::transmute::(no_sub) }; - let i = unsafe { core::mem::transmute::(inactive) }; - let p = unsafe { core::mem::transmute::(paused) }; - let g = unsafe { core::mem::transmute::(grace) }; - - assert_ne!(c, s, "Charged and Skipped must differ"); - assert_ne!(s, n, "Skipped and NoSubscription must differ"); - assert_ne!(n, i, "NoSubscription and Inactive must differ"); - assert_ne!(i, p, "Inactive and Paused must differ"); - assert_ne!(p, g, "Paused and GracePeriodElapsed must differ"); - - // Lock the variant count — increase when a variant is appended. - let total_variants = 6; - assert_eq!(total_variants, 6); -} - -/// Verify round-trip encoding for every variant. -#[test] -fn test_charge_result_round_trip() { - let env = Env::default(); - let _ = env.register_contract(None, FlowPay); - - let variants = [ - ChargeResult::Charged, - ChargeResult::Skipped, - ChargeResult::NoSubscription, - ChargeResult::Inactive, - ChargeResult::Paused, - ChargeResult::GracePeriodElapsed, - ]; - - for variant in variants.iter() { - let val: soroban_sdk::Val = variant.clone().into_val(&env); - let decoded = ChargeResult::try_from_val(&env, &val).unwrap(); - assert_eq!(*variant, decoded, "round-trip failed for a ChargeResult variant"); - } -} - -/// Verify that variant names match the expected set. -/// A rename or reorder breaks this test. -#[test] -fn test_charge_result_partial_eq_identity() { - assert_eq!(ChargeResult::Charged, ChargeResult::Charged); - assert_ne!(ChargeResult::Charged, ChargeResult::Skipped); - assert_ne!(ChargeResult::NoSubscription, ChargeResult::Inactive); - assert_ne!(ChargeResult::Paused, ChargeResult::GracePeriodElapsed); -} - - -// ───────────────────────────────────────────── -// CONTRACT-804: checked arithmetic in trial, fee, and volume paths -// ───────────────────────────────────────────── - -#[test] -fn test_extend_trial_pushes_last_charged_forward() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - let before = client.get_subscription(&user).unwrap().last_charged; - - client.extend_trial(&user, &86400); - - assert_eq!( - client.get_subscription(&user).unwrap().last_charged, - before + 86400 - ); -} - -/// A trial extension past `u64::MAX` must fail closed with the typed -/// `ArithmeticOverflow` (#36) rather than an untyped `unwrap` panic. -#[test] -fn test_extend_trial_overflow_fails_with_typed_error() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - // Push last_charged to the u64 ceiling, then ask for one second more. - client.extend_trial(&user, &(u64::MAX - client.get_subscription(&user).unwrap().last_charged)); - assert_eq!(client.get_subscription(&user).unwrap().last_charged, u64::MAX); - - let res = client.try_extend_trial(&user, &1); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); -} - -/// Extending a paused subscription's trial must fail closed with the typed -/// `SubscriptionPaused` (#17) error rather than advancing `last_charged` into -/// a chargeable state. -#[test] -fn test_extend_trial_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - let before = client.get_subscription(&user).unwrap().last_charged; - - client.pause(&user); - - let res = client.try_extend_trial(&user, &86400); - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(17)))); - assert_eq!(client.get_subscription(&user).unwrap().last_charged, before); -} - -/// `amount * bps` must not wrap for amounts beyond the economic caps. -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_calculate_fee_amount_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - fee::calculate_fee_amount(&env, i128::MAX, 10_000); - }); -} - -#[test] -fn test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - // The largest amount the contract will accept, at the maximum bps. - assert_eq!( - fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 10_000), - MAX_SUBSCRIPTION_AMOUNT - ); - assert_eq!(fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 0), 0); - }); -} - -/// Accruing a fee onto a `TotalProtocolFees` counter at `i128::MAX` must fail -/// closed rather than wrap the protocol's own bookkeeping. -#[test] -fn test_protocol_fee_accrual_overflow_fails_with_typed_error() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - configure_fee(&env, &contract_id, 500); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::TotalProtocolFees, &i128::MAX); - }); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let res = client.try_charge(&user); - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); -} - -/// An accumulator that cannot represent the sum is an overflow (#36), which is -/// a different failure from breaching the hourly cap (#28). -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_global_volume_accumulator_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - env.storage().instance().set( - &DataKey::GlobalVolumeWindow, - &GlobalVolumeWindow { - current_window_start: env.ledger().timestamp(), - accumulated_volume: i128::MAX, - }, - ); - check_and_update_global_volume(&env, 1); - }); -} - -/// A window start near `u64::MAX` must not wrap the rollover comparison. -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_global_volume_window_end_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - env.storage().instance().set( - &DataKey::GlobalVolumeWindow, - &GlobalVolumeWindow { - current_window_start: u64::MAX, - accumulated_volume: 0, - }, - ); - check_and_update_global_volume(&env, 1); - }); -} - -/// Breaching the hourly cap still reports `GlobalVolumeExceeded` (#28) — -/// the overflow work above must not have changed the cap's error mapping. -#[test] -#[should_panic(expected = "Error(Contract, #28)")] -fn test_global_volume_cap_breach_still_reports_28() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - check_and_update_global_volume(&env, GLOBAL_MAX_VOLUME_PER_HOUR + 1); - }); -} - -// ───────────────────────────────────────────── -// CONTRACT-805: batch_charge_skips summary event -// ───────────────────────────────────────────── - -/// Helper: returns the payload of the single `batch_charge_skips` event in the -/// event log, or `None` when no such event was emitted. -fn find_batch_charge_skips(env: &Env) -> Option { - let mut found = None; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - if topic_symbol == Symbol::new(env, "batch_charge_skips") { - assert_eq!( - topics.len(), - 1, - "batch_charge_skips carries no address topic" - ); - assert!( - found.is_none(), - "at most one summary event per batch_charge call" - ); - found = Some(data.try_into_val(env).unwrap()); - } - } - found -} - -/// Helper: funds a fresh user and subscribes them for `interval`. -fn subscribe_funded_user( - env: &Env, - contract_id: &Address, - token_addr: &Address, - merchant: &Address, - interval: u64, -) -> Address { - let client = FlowPayClient::new(env, contract_id); - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &10_000_0000000); - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &10_000_0000000, &200000); - client.subscribe( - &user, - merchant, - &1_0000000, - &interval, - token_addr, - &None, - &None, - ); - user -} - -/// A batch mixing charges with paused / cancelled / missing / grace-elapsed -/// subscriptions emits one summary event whose counts reconcile with the -/// returned results. -#[test] -fn test_batch_charge_emits_skips_summary_with_counts() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - install_admin(&env, &contract_id); - client.propose_grace_period(&3600); - client.commit_grace_period(); - - let paused_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let cancelled_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let grace_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let unknown_user = Address::generate(&env); - - client.pause(&paused_user); - client.cancel(&cancelled_user); - - // Push grace_user past its interval AND its grace window. - env.ledger().with_mut(|l| { - l.timestamp += interval + 3601 + 1; - }); - - // Subscribe the chargeable user now, then advance just past its interval so - // it is due but still inside the grace window. - let chargeable = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(chargeable.clone()); - users.push_back(paused_user.clone()); - users.push_back(cancelled_user.clone()); - users.push_back(grace_user.clone()); - users.push_back(unknown_user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), ChargeResult::Paused); - assert_eq!(results.get(2).unwrap(), ChargeResult::Inactive); - assert_eq!(results.get(3).unwrap(), ChargeResult::GracePeriodElapsed); - assert_eq!(results.get(4).unwrap(), ChargeResult::NoSubscription); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 5); - assert_eq!(summary.charged, 1); - assert_eq!(summary.not_due, 0); - assert_eq!(summary.paused, 1); - assert_eq!(summary.inactive, 1); - assert_eq!(summary.grace_elapsed, 1); - assert_eq!(summary.no_subscription, 1); - assert_eq!(summary.ledger_sequence, env.ledger().sequence()); - - // The counts must account for every submitted address. - assert_eq!( - summary.charged - + summary.not_due - + summary.paused - + summary.inactive - + summary.grace_elapsed - + summary.no_subscription - + summary.allowance_insufficient, - summary.total - ); -} - -/// An all-success batch must not emit the summary — and its `charged` events -/// are unchanged. -#[test] -fn test_batch_charge_all_charged_emits_no_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), ChargeResult::Charged); - - assert!( - find_batch_charge_skips(&env).is_none(), - "an all-charged batch must stay silent" - ); - - // `charged` events are untouched by this feature. - let charged_events = env - .events() - .all() - .iter() - .filter(|(_, topics, _)| { - let s: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - s == Symbol::new(&env, "charged") - }) - .count(); - assert_eq!(charged_events, 2); -} - -/// Not-due skips are the common, uninteresting outcome and must not emit. -#[test] -fn test_batch_charge_not_due_only_emits_no_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Skipped); - assert_eq!(results.get(1).unwrap(), ChargeResult::Skipped); - - assert!( - find_batch_charge_skips(&env).is_none(), - "a not-due-only batch must stay silent" - ); -} - -/// An allowance shortfall is a per-user `AllowanceInsufficient` result (it does -/// not abort the batch) and is an interesting failure: it alone must emit the -/// summary, since a keeper needs to know a subscriber has to re-approve. -#[test] -fn test_batch_charge_allowance_insufficient_counted_in_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let interval: u64 = 86400; - - let ok_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let broke_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - // One stroop short of the gross subscription amount. - token.approve(&broke_user, &contract_id, &(1_0000000 - 1), &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(ok_user.clone()); - users.push_back(broke_user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!( - results.get(1).unwrap(), - ChargeResult::AllowanceInsufficient - ); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 2); - assert_eq!(summary.charged, 1); - assert_eq!(summary.allowance_insufficient, 1); - assert_eq!(summary.not_due, 0); - assert_eq!( - summary.charged - + summary.not_due - + summary.paused - + summary.inactive - + summary.grace_elapsed - + summary.no_subscription - + summary.allowance_insufficient, - summary.total - ); -} - -/// A single interesting failure alongside not-due skips is enough to emit, -/// and the not-due count rides along for reconciliation. -#[test] -fn test_batch_charge_single_interesting_failure_emits_with_not_due_count() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let not_due_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let unknown_user = Address::generate(&env); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(not_due_user.clone()); - users.push_back(unknown_user.clone()); - - client.batch_charge(&users); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 2); - assert_eq!(summary.not_due, 1); - assert_eq!(summary.no_subscription, 1); - assert_eq!(summary.charged, 0); -} - -// Issue #813: batch_charge stress / resource-envelope coverage -// -// These tests exercise `batch_charge` at the configured max batch size and one -// above it, matching the resource envelope documented for `set_max_batch_size`. -// Soroban's per-invocation budget is finite, so each test resets it to -// unlimited up front (`env.budget().reset_unlimited()`, as the existing -// `test_batch_charge_stress` does) so the setup + one `batch_charge` invocation -// is measured without being throttled by the 200 M default budget. -// -// Approximate resource usage for a max-size batch at the default cap (50): -// - cost(n) ~= 50 x (storage read + fee + token transfer_from + events) -// - at a configured cap of 5 the per-entry cost is identical; only `n` varies. -// The relevant ceiling enforced here is the batch-size check in `batch.rs`, -// which fires *before* any charging, so exceeding the cap panics with -// `ContractError::BatchTooLarge` (#20) rather than executing partial work. - -/// Batch-charge exactly the configured max batch size; all entries succeed. -#[test] -fn test_batch_charge_at_configured_max() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - install_admin(&env, &contract_id); - let client = FlowPayClient::new(&env, &contract_id); - - let batch_limit: u32 = 5; - client.set_max_batch_size(&batch_limit); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..batch_limit { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - let results = client.batch_charge(&users); - assert_eq!(results.len(), batch_limit); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } - for i in 0..batch_limit { - let u = users.get(i).unwrap(); - assert!(client.get_subscription(&u).unwrap().active); - } -} - -/// Batch-charge one above the configured max panics with BatchTooLarge (#20). -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_above_configured_max_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - install_admin(&env, &contract_id); - let client = FlowPayClient::new(&env, &contract_id); - - let batch_limit: u32 = 5; - client.set_max_batch_size(&batch_limit); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..=batch_limit { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - client.batch_charge(&users); -} - -/// Batch-charge the default max (50) without explicit configuration succeeds. -#[test] -fn test_batch_charge_at_default_max() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..50 { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - let results = client.batch_charge(&users); - assert_eq!(results.len(), 50); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } - for i in 0..50u32 { - let u = users.get(i).unwrap(); - assert!(client.get_subscription(&u).unwrap().active); - } -} - -/// Batch-charge one above the default max panics with BatchTooLarge (#20). -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_over_default_max_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - client.batch_charge(&users); -} - -// -// Issue #810: authorization-boundary tests -// -// Each admin entrypoint is tested in two states: -// (a) success with admin auth called via the normal client method inside -// `mock_all_auths` -// (b) panic when no admin is set called via try_* so the contract error is -// surfaced as an Err, not a hard panic -// -// Note: `setup()` enables `env.mock_all_auths()`, so a "non-admin rejected" -// variant cannot force `require_admin` to fail in this environment; rejection -// is instead covered by the no-admin panic path and the contract's own -// `require_admin` guard. -// - -// -- freeze_merchant ---------------------------------------------------------- - -/// Admin can freeze a merchant (happy path). -#[test] -fn test_freeze_merchant_admin_success() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.freeze_merchant(&merchant, &None); - - assert!(client.is_merchant_frozen(&merchant)); -} - -/// freeze_merchant panics when no admin has been set. -#[test] -fn test_freeze_merchant_no_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_freeze_merchant(&merchant, &None); - assert!(result.is_err()); -} - -// -- propose_fee -------------------------------------------------------------- - -/// Admin can propose a fee (happy path). -#[test] -fn test_propose_fee_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - - assert_eq!(client.get_fee(), None); -} - -/// propose_fee panics when no admin has been set. -#[test] -fn test_propose_fee_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - let result = client.try_propose_fee(&collector, &100); - assert!(result.is_err()); -} - -// -- set_min_interval --------------------------------------------------------- - -/// Admin can set min_interval (happy path). -#[test] -fn test_set_min_interval_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_min_interval(&7200); - assert_eq!(client.get_min_interval(), 7200); -} - -/// set_min_interval panics when no admin has been set. -#[test] -fn test_set_min_interval_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_min_interval(&7200); - assert!(result.is_err()); -} - -// -- batch_cancel ------------------------------------------------------------- - -/// Admin can batch-cancel subscriptions (happy path). -#[test] -fn test_batch_cancel_admin_success() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(u.clone()); - - client.batch_cancel(&users); - - let sub = client.get_subscription(&u).unwrap(); - assert!(!sub.active); -} - -/// batch_cancel panics when no admin has been set. -#[test] -fn test_batch_cancel_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_batch_cancel(&users); - assert!(result.is_err()); -} - -// -- whitelist_batch_add ------------------------------------------------------ - -/// Admin can batch-add merchants to the whitelist (happy path). -#[test] -fn test_whitelist_batch_add_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); - - let added = client.whitelist_batch_add(&merchants); - assert_eq!(added, 2); -} - -/// whitelist_batch_add panics when no admin has been set. -#[test] -fn test_whitelist_batch_add_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchants = soroban_sdk::Vec::new(&env); - let result = client.try_whitelist_batch_add(&merchants); - assert!(result.is_err()); -} - -// -- batch_pause_subscriptions ------------------------------------------------ - -/// Admin can batch-pause subscriptions (happy path). -#[test] -fn test_batch_pause_subscriptions_admin_success() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(u.clone()); - - client.batch_pause_subscriptions(&users); - - let sub = client.get_subscription(&u).unwrap(); - assert!(sub.paused); -} - -/// batch_pause_subscriptions panics when no admin has been set. -#[test] -fn test_batch_pause_subscriptions_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_batch_pause_subscriptions(&users); - assert!(result.is_err()); -} - -// -- clear_fee ---------------------------------------------------------------- - -/// Admin can clear fee (happy path). -#[test] -fn test_clear_fee_admin_success() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - client.commit_fee(); - assert!(client.get_fee().is_some()); - - client.clear_fee(); - assert_eq!(client.get_fee(), None); -} - -/// clear_fee panics when no admin has been set. -#[test] -fn test_clear_fee_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_clear_fee(); - assert!(result.is_err()); -} - -// -- set_whitelist_enabled ---------------------------------------------------- - -/// Admin can toggle whitelist on/off (happy path). -#[test] -fn test_set_whitelist_enabled_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_whitelist_enabled(&true); - assert!(client.is_whitelist_enabled()); - - client.set_whitelist_enabled(&false); - assert!(!client.is_whitelist_enabled()); -} - -/// set_whitelist_enabled panics when no admin has been set. -#[test] -fn test_set_whitelist_enabled_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_whitelist_enabled(&true); - assert!(result.is_err()); -} - -// -- set_max_batch_size ------------------------------------------------------- - -/// Admin can set max_batch_size (happy path). -#[test] -fn test_set_max_batch_size_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_batch_size(&100); - assert_eq!(client.get_max_batch_size(), 100); -} - -/// set_max_batch_size panics when no admin has been set. -#[test] -fn test_set_max_batch_size_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_max_batch_size(&100); - assert!(result.is_err()); -} - -// -- pause_contract ----------------------------------------------------------- - -/// Admin can pause the contract (happy path). -#[test] -fn test_pause_contract_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.pause_contract(); - assert!(client.is_contract_paused()); -} - -/// pause_contract panics when no admin has been set. -#[test] -fn test_pause_contract_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_pause_contract(); - assert!(result.is_err()); -} - -// -- migrate ------------------------------------------------------------------ - -/// Admin can run storage migration (happy path). -#[test] -fn test_migrate_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - client.migrate(&users); - assert_eq!(client.get_schema_version(), 3); -} - -/// migrate panics when no admin has been set. -#[test] -fn test_migrate_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_migrate(&users); - assert!(result.is_err()); -} - -// -- set_global_volume_cap ---------------------------------------------------- - -/// Admin can set the global volume cap (happy path). -#[test] -fn test_set_global_volume_cap_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_global_volume_cap(&100_0000000); - assert_eq!(client.get_global_volume_cap(), 100_0000000); -} - -/// set_global_volume_cap panics when no admin has been set. -#[test] -fn test_set_global_volume_cap_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_global_volume_cap(&100_0000000); - assert!(result.is_err()); -} - - -#![cfg(test)] -#![allow( - clippy::bool_assert_comparison, - unused_variables, - dead_code, - clippy::inconsistent_digit_grouping -)] - -use super::*; -use soroban_sdk::{ - testutils::{Address as _, Events as _, Ledger}, - token::{Client as TokenClient, StellarAssetClient}, - Address, BytesN, Env, IntoVal, Symbol, TryFromVal, TryIntoVal, Vec, -}; - -/// Returns (env, contract_id, token_addr, user, merchant) -fn setup() -> (Env, Address, Address, Address, Address) { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - env.storage().instance().set(&DataKey::SchemaVersion, &3u32); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &10_000_0000000, &200000); - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - (env, contract_id, token_addr, user, merchant) -} - -/// Helper: deploy second token -fn setup_second_token(env: &Env, contract_id: &Address, user: &Address) -> Address { - let token_admin = Address::generate(env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let sac = StellarAssetClient::new(env, &token_addr); - sac.mint(user, &10_000_0000000); - - let token = TokenClient::new(env, &token_addr); - token.approve(user, contract_id, &10_000_0000000, &200000); - - token_addr -} - -fn setup_funded_user(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &10_000_0000000); - - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &10_000_0000000, &200); - - user -} - -fn assert_last_event(env: &Env, topic: &str) { - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - let data_unit: () = data.try_into_val(env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(env, topic)); - assert_eq!(data_unit, ()); -} - -fn assert_last_user_event(env: &Env, topic: &str, user: &Address) { - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(env, topic)); - assert_eq!(topic_user, user.clone()); -} - -fn count_user_events(env: &Env, topic: &str, user: &Address) -> u32 { - let expected_topic = Symbol::new(env, topic); - let mut count = 0; - - for (_, topics, _) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - if topic_symbol != expected_topic { - continue; - } - - let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); - if topic_user == user.clone() { - count += 1; - } - } - - count -} - -// ───────────────────────────────────────────── -// Core functionality tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_and_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - assert_eq!(sub.token, token_addr); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let sub_after = client.get_subscription(&user).unwrap(); - assert!(sub_after.last_charged > 0); -} -#[test] -fn test_subscription_age_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - env.ledger().with_mut(|l| { - l.timestamp = 1; - }); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let elapsed: u64 = 1000; - env.ledger().with_mut(|l| { - l.timestamp += elapsed; - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, Some(elapsed)); -} - -#[test] -fn test_subscription_age_resets_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += 5000; - }); - - client.cancel(&user); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let elapsed_after_resub: u64 = 200; - env.ledger().with_mut(|l| { - l.timestamp += elapsed_after_resub; - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, Some(elapsed_after_resub)); -} - -#[test] -fn test_subscription_age_none_when_no_subscription() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let age = client.get_subscription_age(&user); - assert_eq!(age, None); -} - -#[test] -fn test_subscription_age_none_for_migrated_sentinel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Simulate a pre-existing subscription migrated with the created_at = 0 sentinel - env.as_contract(&contract_id, || { - let key = crate::DataKey::Subscription(user.clone()); - let mut sub: crate::Subscription = env.storage().persistent().get(&key).unwrap(); - sub.created_at = 0; - env.storage().persistent().set(&key, &sub); - }); - - let age = client.get_subscription_age(&user); - assert_eq!(age, None); -} - -#[test] -fn test_batch_charge_empty() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let results = client.batch_charge(&soroban_sdk::vec![&env]); - assert_eq!(results.len(), 0); -} - -/// charge() must decrease user balance and increase merchant balance by exactly the subscription amount. -#[test] -fn test_charge_exact_transfer_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let user_balance_after = token.balance(&user); - let merchant_balance_after = token.balance(&merchant); - - assert_eq!( - user_balance_before - user_balance_after, - amount, - "user balance should decrease by exactly the subscription amount" - ); - assert_eq!( - merchant_balance_after - merchant_balance_before, - amount, - "merchant balance should increase by exactly the subscription amount" - ); -} - -#[test] -fn test_charged_event_includes_ledger_sequence() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += 86401; - l.sequence_number += 7; - }); - - client.charge(&user); - - let mut seen_charge_event = false; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - if topic_symbol == Symbol::new(&env, "charged") { - let event_data: crate::events::ChargeEventData = data.try_into_val(&env).unwrap(); - assert_eq!(event_data.ledger_sequence, env.ledger().sequence()); - seen_charge_event = true; - } - } - - assert!(seen_charge_event, "expected a charged event"); -} - -#[test] -fn test_charge_applies_protocol_fee_and_records_net_revenue() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &500); - client.commit_fee(); // 5% - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let expected_net: i128 = amount - expected_fee; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&merchant), expected_net); -} - -#[test] -fn test_charge_routes_net_to_custom_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - let recipient = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &500); - client.commit_fee(); // 5% - - // merchant sets a custom recipient (directly write persistent storage for test) - env.as_contract(&contract_id, || { - env.storage() - .persistent() - .set(&DataKey::MerchantFeeRecipient(merchant.clone()), &recipient); - env.storage().persistent().extend_ttl( - &DataKey::MerchantFeeRecipient(merchant.clone()), - SUBSCRIPTION_TTL_LEDGERS, - SUBSCRIPTION_TTL_LEDGERS, - ); - }); - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let expected_net: i128 = amount - expected_fee; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let recipient_before = token.balance(&recipient); - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&recipient) - recipient_before, expected_fee); - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -// ───────────────────────────────────────────── -// CONTRACT-802: gross-allowance preflight before the two-leg fee transfer -// ───────────────────────────────────────────── - -/// Helper: installs an admin and commits `bps` with a fresh collector. -fn configure_fee(env: &Env, contract_id: &Address, bps: u32) -> Address { - let client = FlowPayClient::new(env, contract_id); - install_admin(env, contract_id); - let collector = Address::generate(env); - client.propose_fee(&collector, &bps); - client.commit_fee(); - collector -} - -/// An allowance exactly equal to the gross amount must cover BOTH transfer -/// legs (fee + net) when fee_bps > 0. -#[test] -fn test_charge_exact_gross_allowance_succeeds_with_fee() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Tighten the allowance to exactly the gross amount — not a stroop more. - token.approve(&user, &contract_id, &amount, &200000); - assert_eq!(token.allowance(&user, &contract_id), amount); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), expected_fee); - assert_eq!(token.balance(&merchant), amount - expected_fee); - // Both legs drew on the same allowance, consuming it exactly. - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -/// One stroop short of the gross amount must fail closed with the typed -/// `InsufficientAllowance` (#8) and move no funds on either leg. -#[test] -fn test_charge_allowance_below_gross_fails_closed_before_any_transfer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &(amount - 1), &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - let res = client.try_charge(&user); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); - // Neither leg ran: the fee leg alone would have fit in the allowance. - assert_eq!(token.balance(&collector), 0); - assert_eq!(token.balance(&merchant), 0); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -/// A fee that rounds down to zero still charges the full gross amount and -/// needs the full gross allowance. -#[test] -fn test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - // 1 * 500 / 10_000 == 0 — the fee leg is skipped entirely. - let amount: i128 = 1; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &amount, &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), 0); - assert_eq!(token.balance(&merchant), amount); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -/// The maximum in-bounds fee (10_000 bps == 100%) sends everything to the -/// collector and still passes the single gross preflight. -#[test] -fn test_charge_max_bps_exact_allowance_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 10_000); // 100% - - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - token.approve(&user, &contract_id, &amount, &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&collector), amount); - assert_eq!(token.balance(&merchant), 0); - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -/// pay_per_use runs the same two-leg pattern and the same preflight. -#[test] -fn test_pay_per_use_exact_gross_allowance_succeeds_with_fee() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - let amount: i128 = 10_0000000; - let expected_fee: i128 = 500_0000; - token.approve(&user, &contract_id, &amount, &200000); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&collector), expected_fee); - assert_eq!(token.balance(&merchant), amount - expected_fee); - assert_eq!(token.allowance(&user, &contract_id), 0); -} - -#[test] -fn test_pay_per_use_allowance_below_gross_fails_closed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let collector = configure_fee(&env, &contract_id, 500); // 5% - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - let amount: i128 = 10_0000000; - token.approve(&user, &contract_id, &(amount - 1), &200000); - - let res = client.try_pay_per_use(&user, &amount); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); - assert_eq!(token.balance(&collector), 0); - assert_eq!(client.get_total_protocol_fees(), 0); -} - -// ───────────────────────────────────────────── -// Issue #837 / Issue 042: shared allowance-requirement helper -// ───────────────────────────────────────────── - -struct AllowanceReqCase { - allowance: i128, - gross: i128, - fee_bps: u32, - expected: bool, - label: &'static str, -} - -/// Table-driven unit tests for the shared allowance helper: zero, exact, and -/// insufficient allowance, plus fee-off vs fee-on gross (never net-only). -#[test] -fn test_allowance_covers_gross_table() { - let gross: i128 = 10_000; - let fee_on_bps: u32 = 500; // 5% - let fee_on_net: i128 = gross - (gross * fee_on_bps as i128 / 10_000); // 9_500 - - let cases = [ - AllowanceReqCase { - allowance: 0, - gross, - fee_bps: 0, - expected: false, - label: "zero allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: 0, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "zero allowance, fee_bps > 0", - }, - AllowanceReqCase { - allowance: gross, - gross, - fee_bps: 0, - expected: true, - label: "exact allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross, - gross, - fee_bps: fee_on_bps, - expected: true, - label: "exact gross allowance, fee_bps > 0", - }, - AllowanceReqCase { - allowance: gross - 1, - gross, - fee_bps: 0, - expected: false, - label: "insufficient (one stroop short), fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross - 1, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "insufficient (one stroop short of gross), fee_bps > 0", - }, - AllowanceReqCase { - allowance: fee_on_net, - gross, - fee_bps: fee_on_bps, - expected: false, - label: "fee-on net-only allowance is insufficient vs gross", - }, - AllowanceReqCase { - allowance: gross + 1, - gross, - fee_bps: 0, - expected: true, - label: "surplus allowance, fee_bps = 0", - }, - AllowanceReqCase { - allowance: gross + 1, - gross, - fee_bps: fee_on_bps, - expected: true, - label: "surplus allowance, fee_bps > 0", - }, - ]; - - for c in cases { - assert_eq!( - validation::required_allowance(c.gross, c.fee_bps), - c.gross, - "required allowance must be gross ({})", - c.label - ); - assert_eq!( - validation::allowance_covers_gross(c.allowance, c.gross, c.fee_bps), - c.expected, - "{}", - c.label - ); - } -} - -struct SimulateAllowanceCase { - fee_bps: u32, - allowance: i128, - expected: ChargeSimResult, - label: &'static str, -} - -/// `simulate_charge` uses the shared helper: fee-off and fee-on both require -/// the gross amount, so a net-only allowance fails when fees are on. -#[test] -fn test_simulate_charge_allowance_requirement_table() { - let amount: i128 = 10_0000000; - let interval: u64 = 86400; - let fee_on_bps: u32 = 500; - let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); - - let cases = [ - SimulateAllowanceCase { - fee_bps: 0, - allowance: 0, - expected: ChargeSimResult::InsufficientAllowance, - label: "zero allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: 0, - allowance: amount, - expected: ChargeSimResult::WouldSucceed, - label: "exact allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: 0, - allowance: amount - 1, - expected: ChargeSimResult::InsufficientAllowance, - label: "insufficient allowance, fee_bps = 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: 0, - expected: ChargeSimResult::InsufficientAllowance, - label: "zero allowance, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount, - expected: ChargeSimResult::WouldSucceed, - label: "exact gross allowance, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount - 1, - expected: ChargeSimResult::InsufficientAllowance, - label: "one stroop short of gross, fee_bps > 0", - }, - SimulateAllowanceCase { - fee_bps: fee_on_bps, - allowance: fee_on_net, - expected: ChargeSimResult::InsufficientAllowance, - label: "net-only allowance, fee_bps > 0", - }, - ]; - - for c in cases { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - if c.fee_bps > 0 { - configure_fee(&env, &contract_id, c.fee_bps); - } - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - token.approve(&user, &contract_id, &c.allowance, &200000); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - assert_eq!(client.simulate_charge(&user), c.expected, "{}", c.label); - } -} - -struct SubscribeAllowanceCase { - fee_bps: u32, - allowance: i128, - expect_ok: bool, - label: &'static str, -} - -/// subscribe() validation uses the same gross-allowance helper, including -/// when protocol fees are configured (requirement is still the gross amount). -#[test] -fn test_subscribe_allowance_requirement_table() { - let amount: i128 = 10_0000000; - let fee_on_bps: u32 = 500; - let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); - - let cases = [ - SubscribeAllowanceCase { - fee_bps: 0, - allowance: 0, - expect_ok: false, - label: "zero allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: 0, - allowance: amount, - expect_ok: true, - label: "exact allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: 0, - allowance: amount - 1, - expect_ok: false, - label: "insufficient allowance, fee_bps = 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: 0, - expect_ok: false, - label: "zero allowance, fee_bps > 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: amount, - expect_ok: true, - label: "exact gross allowance, fee_bps > 0", - }, - SubscribeAllowanceCase { - fee_bps: fee_on_bps, - allowance: fee_on_net, - expect_ok: false, - label: "net-only allowance, fee_bps > 0", - }, - ]; - - for c in cases { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - if c.fee_bps > 0 { - configure_fee(&env, &contract_id, c.fee_bps); - } - - token.approve(&user, &contract_id, &c.allowance, &200000); - let result = - client.try_subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - - if c.expect_ok { - assert!(result.is_ok(), "{}", c.label); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.amount, amount, "{}", c.label); - } else { - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error(8))), - "{}", - c.label - ); - assert!( - client.get_subscription(&user).is_none(), - "failed subscribe must not write storage ({})", - c.label - ); - } - } -} - -/// `has_sufficient_allowance` reads SAC allowance and never transfers. -#[test] -fn test_has_sufficient_allowance_does_not_transfer() { - let (env, contract_id, token_addr, user, _merchant) = setup(); - let token = TokenClient::new(&env, &token_addr); - let amount: i128 = 1_0000000; - let balance_before = token.balance(&user); - - env.as_contract(&contract_id, || { - assert!(validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - amount - )); - }); - - token.approve(&user, &contract_id, &0, &200000); - - env.as_contract(&contract_id, || { - assert!(!validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - amount - )); - assert!(validation::has_sufficient_allowance( - &env, - &user, - &token_addr, - 0 - )); - }); - - assert_eq!(token.balance(&user), balance_before); -} - -// Note: setter input validation is covered in contract code; invoking it directly -// via the generated client isn't available in these tests. The storage-level -// behavior for routing is covered by the tests above. - -#[test] -fn test_charge_with_zero_fee_bps_skips_fee_transfer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &0); - client.commit_fee(); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -/// subscribe() must store all Subscription fields exactly as provided. -#[test] -fn test_subscription_struct_fields_match_input() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; // 30 days - - let subscribe_time = env.ledger().timestamp(); - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - - assert_eq!(sub.merchant, merchant, "merchant should match"); - assert_eq!(sub.amount, amount, "amount should match"); - assert_eq!(sub.interval, interval, "interval should match"); - assert!(sub.active, "subscription should be active"); - assert!(!sub.paused, "subscription should not be paused"); - assert_eq!(sub.token, token_addr, "token should match"); - // last_charged is set to subscribe time when no trial period - assert_eq!( - sub.last_charged, subscribe_time, - "last_charged should be set to subscribe time" - ); -} - -// ───────────────────────────────────────────── -// Issue #194: get_trial_end() tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_trial_end_with_trial_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let now = env.ledger().timestamp(); - let trial_period: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &Some(trial_period), - &None, - ); - - assert_eq!(client.get_trial_end(&user), Some(now + trial_period)); -} - -#[test] -fn test_get_trial_end_without_trial_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert!(client.get_trial_end(&user).is_none()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #6)")] -fn test_charge_before_trial_end_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &Some(86400u64), - &None, - ); - - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_subscribe_non_whitelisted_merchant_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_whitelisted_merchant_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.add_merchant(&merchant); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant); - assert!(client.is_merchant_whitelisted(&merchant)); -} - -#[test] -fn test_is_merchant_whitelisted_returns_false_for_non_whitelisted() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - assert!(!client.is_merchant_whitelisted(&merchant)); -} - -#[test] -fn test_set_whitelist_enabled_false_allows_any_merchant() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.set_whitelist_enabled(&true); - client.set_whitelist_enabled(&false); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant); -} - -#[test] -fn test_get_whitelist_enabled_defaults_to_true() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - assert!(client.get_whitelist_enabled()); -} - -#[test] -fn test_get_whitelist_enabled_toggles() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Default is true - assert!(client.get_whitelist_enabled()); - - // False after set_whitelist_enabled(false) - client.set_whitelist_enabled(&false); - assert!(!client.get_whitelist_enabled()); - - // True after re-enabling - client.set_whitelist_enabled(&true); - assert!(client.get_whitelist_enabled()); -} - -// ───────────────────────────────────────────── -// Merchant freeze tests -// ───────────────────────────────────────────── - -/// subscribe to a frozen merchant panics with ContractError::MerchantFrozen. -#[test] -#[should_panic(expected = "Error(Contract, #22)")] -fn test_subscribe_to_frozen_merchant_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.freeze_merchant(&merchant, &None); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -/// An existing subscriber can still be charged after their merchant is frozen — -/// freeze only blocks new subscriptions, not existing charge cycles. -#[test] -fn test_charge_succeeds_after_merchant_frozen() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.last_charged, interval + 1); -} - -/// pay_per_use is unaffected by merchant freeze status for an existing subscriber. -#[test] -fn test_pay_per_use_succeeds_after_merchant_frozen() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.freeze_merchant(&merchant, &None); - - client.pay_per_use(&user, &1_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 1_0000000); -} - -/// is_merchant_frozen reflects freeze/unfreeze state changes. -#[test] -fn test_is_merchant_frozen_reflects_state() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert!(!client.is_merchant_frozen(&merchant)); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - - client.unfreeze_merchant(&merchant); - assert!(!client.is_merchant_frozen(&merchant)); -} - -/// Freezing a merchant that is not whitelisted must still succeed — the two -/// states (whitelist, freeze) are independent of each other. -#[test] -fn test_freeze_merchant_independent_of_whitelist() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Merchant is not whitelisted at all, and whitelist enforcement is off. - assert!(!client.is_merchant_whitelisted(&merchant)); - - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); - assert!(!client.is_merchant_whitelisted(&merchant)); -} - -/// freeze_merchant is idempotent — freezing an already-frozen merchant must not panic. -#[test] -fn test_freeze_merchant_idempotent() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.freeze_merchant(&merchant, &None); - client.freeze_merchant(&merchant, &None); - assert!(client.is_merchant_frozen(&merchant)); -} - -/// unfreeze_merchant on a non-frozen merchant must not panic. -#[test] -fn test_unfreeze_merchant_non_frozen_is_noop() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.unfreeze_merchant(&merchant); - assert!(!client.is_merchant_frozen(&merchant)); -} - -/// freeze_merchant requires admin auth. -#[test] -#[should_panic] -fn test_freeze_merchant_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin configured — require_admin panics with "admin not set" - client.freeze_merchant(&merchant, &None); -} - -/// unfreeze_merchant requires admin auth. -#[test] -#[should_panic] -fn test_unfreeze_merchant_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin configured — require_admin panics with "admin not set" - client.unfreeze_merchant(&merchant); -} - -#[test] -#[should_panic] -fn test_non_admin_add_and_remove_merchant_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.add_merchant(&merchant); - client.remove_merchant(&merchant); -} - -// ───────────────────────────────────────────── -// CONTRACT-20: whitelist_batch_add / whitelist_batch_remove tests -// ───────────────────────────────────────────── - -#[test] -fn test_whitelist_batch_add_three_merchants() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m2.clone()); - merchants.push_back(m3.clone()); - - let count = client.whitelist_batch_add(&merchants); - - assert_eq!(count, 3); - assert!(client.is_merchant_whitelisted(&m1)); - assert!(client.is_merchant_whitelisted(&m2)); - assert!(client.is_merchant_whitelisted(&m3)); -} - -#[test] -fn test_whitelist_batch_remove_two_merchants() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - client.add_merchant(&m1); - client.add_merchant(&m2); - - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m2.clone()); - - let count = client.whitelist_batch_remove(&merchants); - - assert_eq!(count, 2); - assert!(!client.is_merchant_whitelisted(&m1)); - assert!(!client.is_merchant_whitelisted(&m2)); -} - -#[test] -fn test_whitelist_batch_add_duplicates_does_not_panic() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - merchants.push_back(m1.clone()); - - let count = client.whitelist_batch_add(&merchants); - - assert_eq!(count, 2); - assert!(client.is_merchant_whitelisted(&m1)); -} - -#[test] -fn test_whitelist_batch_remove_non_whitelisted_is_noop() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(m1.clone()); - - let count = client.whitelist_batch_remove(&merchants); - - assert_eq!(count, 1); - assert!(!client.is_merchant_whitelisted(&m1)); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_add_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut merchants = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - merchants.push_back(Address::generate(&env)); - } - client.whitelist_batch_add(&merchants); -} - -#[test] -#[should_panic] -fn test_whitelist_batch_add_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - let mut merchants = soroban_sdk::Vec::new(&env); - merchants.push_back(merchant.clone()); - client.whitelist_batch_add(&merchants); -} - -// ───────────────────────────────────────────── -// CONTRACT-803: configurable whitelist batch limit -// ───────────────────────────────────────────── - -/// Helper: installs a generated admin so admin-gated entrypoints are callable. -fn install_admin(env: &Env, contract_id: &Address) { - let admin = Address::generate(env); - env.as_contract(contract_id, || { - storage::set_admin(env, &admin); - }); -} - -/// Helper: installs an admin and returns a Vec of `n` freshly generated merchants. -fn whitelist_admin_and_merchants( - env: &Env, - contract_id: &Address, - n: u32, -) -> soroban_sdk::Vec
{ - install_admin(env, contract_id); - - let mut merchants = soroban_sdk::Vec::new(env); - for _ in 0..n { - merchants.push_back(Address::generate(env)); - } - merchants -} - -#[test] -fn test_max_whitelist_batch_size_defaults_to_50() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - assert_eq!(client.get_max_whitelist_batch_size(), 50); - // The whitelist knob is independent of the charge-batch knob. - client.set_max_batch_size(&10); - assert_eq!(client.get_max_whitelist_batch_size(), 50); - assert_eq!(client.get_max_batch_size(), 10); -} - -#[test] -fn test_set_max_whitelist_batch_size_lowers_cap() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); - - client.set_max_whitelist_batch_size(&2); - assert_eq!(client.get_max_whitelist_batch_size(), 2); - - // Exactly at the configured cap still succeeds. - assert_eq!(client.whitelist_batch_add(&merchants), 2); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_add_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.whitelist_batch_add(&merchants); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_whitelist_batch_remove_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.whitelist_batch_remove(&merchants); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_merchant_statuses_over_configured_cap_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); - - client.set_max_whitelist_batch_size(&2); - client.get_merchant_statuses(&merchants); -} - -#[test] -fn test_raised_whitelist_batch_cap_allows_more_than_default() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 51); - - // 51 entries panic under the default cap; raising the cap admits them. - client.set_max_whitelist_batch_size(&60); - assert_eq!(client.whitelist_batch_add(&merchants), 51); - assert_eq!(client.get_whitelist_size(), 51); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_whitelist_batch_size_zero_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_whitelist_batch_size(&0); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_whitelist_batch_size_above_ceiling_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_whitelist_batch_size(&(MAX_BATCH_SIZE_CEILING + 1)); -} - -#[test] -#[should_panic] -fn test_set_max_whitelist_batch_size_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - client.set_max_whitelist_batch_size(&10); -} - -#[test] -fn test_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active); -} - -#[test] -fn test_referral_cleared_on_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer)); - - client.cancel(&user); - - assert_eq!(client.get_referrer(&user), None); -} - -#[test] -#[should_panic] -fn test_charge_too_early() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.charge(&user); -} - -// ───────────────────────────────────────────── -// Multi-token + advanced features -// ───────────────────────────────────────────── - -#[test] -fn test_multi_token_independent_subscriptions() { - let (env, contract_id, token_a, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let token_b = setup_second_token(&env, &contract_id, &user_b); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, &merchant, &amount, &interval, &token_a, &None, &None, - ); - client.subscribe( - &user_b, &merchant, &amount, &interval, &token_b, &None, &None, - ); - - let sub_a = client.get_subscription(&user_a).unwrap(); - let sub_b = client.get_subscription(&user_b).unwrap(); - - assert_eq!(sub_a.token, token_a); - assert_eq!(sub_b.token, token_b); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user_a); - client.charge(&user_b); -} - -#[test] -fn test_user_can_switch_token() { - let (env, contract_id, token_a, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let token_b = setup_second_token(&env, &contract_id, &user); - let interval: u64 = 86400; - - client.subscribe( - &user, &merchant, &1_0000000, &interval, &token_a, &None, &None, - ); - client.subscribe( - &user, &merchant, &2_0000000, &interval, &token_b, &None, &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.token, token_b); - assert_eq!(sub.amount, 2_0000000); -} - -#[test] -fn test_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let token = TokenClient::new(&env, &token_addr); - let before = token.balance(&merchant); - - client.pay_per_use(&user, &5_0000000); - - assert_eq!(token.balance(&merchant), before + 5_0000000); -} - -#[test] -fn test_pay_per_use_applies_protocol_fee_and_records_net_revenue() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &250); - client.commit_fee(); // 2.5% - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 8_0000000; - let expected_fee: i128 = 200_0000; - let expected_net: i128 = amount - expected_fee; - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&merchant) - merchant_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&merchant), expected_net); -} - -// ───────────────────────────────────────────── -// CONTRACT-23: pay_per_use_to tests -// ───────────────────────────────────────────── - -#[test] -fn test_pay_per_use_to_transfers_to_recipient_not_merchant() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 5_0000000; - let merchant_before = token.balance(&merchant); - let recipient_before = token.balance(&recipient); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&merchant), merchant_before); - assert_eq!(token.balance(&recipient) - recipient_before, amount); - assert_eq!(client.get_merchant_revenue(&recipient), amount); - assert_eq!(client.get_merchant_revenue(&merchant), 0); -} - -#[test] -fn test_pay_per_use_to_applies_protocol_fee_to_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - let recipient = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &250); - client.commit_fee(); // 2.5% - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 8_0000000; - let expected_fee: i128 = 200_0000; - let expected_net: i128 = amount - expected_fee; - let recipient_before = token.balance(&recipient); - let collector_before = token.balance(&collector); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&recipient) - recipient_before, expected_net); - assert_eq!(token.balance(&collector) - collector_before, expected_fee); - assert_eq!(client.get_merchant_revenue(&recipient), expected_net); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_rejects_non_whitelisted_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.add_merchant(&merchant); - client.set_whitelist_enabled(&true); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let recipient = Address::generate(&env); // never whitelisted - client.pay_per_use_to(&user, &1_0000000, &recipient); -} - -#[test] -fn test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 3_0000000; - let merchant_before = token.balance(&merchant); - - client.pay_per_use_to(&user, &amount, &merchant); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(client.get_merchant_revenue(&merchant), amount); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_daily_limit_shared_with_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - - client.pay_per_use(&user, &6_0000000); - // Combined spend (6 + 6 = 12) exceeds the 10 limit, even though this - // second call routes through pay_per_use_to to a different recipient. - client.pay_per_use_to(&user, &6_0000000, &recipient); -} - -#[test] -fn test_pay_per_use_with_zero_fee_bps_transfers_full_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let admin = Address::generate(&env); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&collector, &0); - client.commit_fee(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 3_0000000; - let merchant_before = token.balance(&merchant); - let collector_before = token.balance(&collector); - - client.pay_per_use(&user, &amount); - - assert_eq!(token.balance(&merchant) - merchant_before, amount); - assert_eq!(token.balance(&collector) - collector_before, 0); -} - -#[test] -#[should_panic] -fn test_pay_per_use_inactive() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - client.pay_per_use(&user, &1_0000000); -} - -/// pay_per_use() must not update last_charged, confirming it is independent of the recurring billing cycle. -#[test] -fn test_pay_per_use_does_not_update_last_charged() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - let last_charged_before = sub_before.last_charged; - - // Advance ledger time so we can verify last_charged isn't simply matching the current time - env.ledger().with_mut(|l| { - l.timestamp += interval + 1000; - }); - - client.pay_per_use(&user, &5_0000000); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!( - sub_after.last_charged, last_charged_before, - "pay_per_use should not update last_charged" - ); -} - -#[test] -#[should_panic] -fn test_pay_per_use_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - client.pay_per_use(&random, &1_0000000); -} - -// ───────────────────────────────────────────── -// Edge cases -// ───────────────────────────────────────────── - -#[test] -#[should_panic] -fn test_pay_per_use_zero_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &0); -} - -#[test] -#[should_panic] -fn test_pay_per_use_exceeds_cap() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &(MAX_AMOUNT + 1)); -} - -/// initialize() still works for backward compat but is not required. -#[test] -fn test_initialize_backward_compat() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - // initialize with a default token — should not affect per-sub token - client.initialize(&token_addr, &admin); - - let token_b = setup_second_token(&env, &contract_id, &user); - client.subscribe(&user, &merchant, &1_0000000, &86400, &token_b, &None, &None); - - // Subscription uses token_b, not the initialized default - assert_eq!(client.get_subscription(&user).unwrap().token, token_b); -} - -// ── Issue #14: cancel nonexistent subscription ─────────────────────────────── - -/// cancel() must panic with "no subscription found" when called on a user with no subscription. -#[test] -#[should_panic] -fn test_cancel_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - client.cancel(&random); -} - -// ── Issue #13: get_subscription for nonexistent subscription ───────────────── - -/// get_subscription() must return None for an address with no subscription. -#[test] -fn test_get_subscription_nonexistent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!( - client.get_subscription(&random).is_none(), - "get_subscription should return None for unknown address" - ); -} -// ── Issue #12: last_charged timestamp update ───────────────────────────────── - -/// charge() must update last_charged to the current ledger timestamp. -#[test] -fn test_charge_updates_last_charged() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 30 * 24 * 60 * 60; // 30 days - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Record the timestamp before advancing time - let subscribe_time = env.ledger().timestamp(); - - // Advance ledger time past interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1000; // advance by interval + 1000 seconds - }); - - // Record the timestamp right before charge - let charge_time = env.ledger().timestamp(); - assert!( - charge_time > subscribe_time, - "charge time should be after subscribe time" - ); - - client.charge(&user); - - let sub_after = client.get_subscription(&user).unwrap(); - // Verify last_charged is exactly equal to the charge_time - assert_eq!( - sub_after.last_charged, charge_time, - "last_charged should equal the ledger timestamp at charge time" - ); -} - -#[test] -#[should_panic] -fn test_zero_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &0, &86400, &token_addr, &None, &None); -} - -#[test] -#[should_panic] -fn test_zero_interval() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); -} - -#[test] -#[should_panic] -fn test_interval_too_short() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &59, &token_addr, &None, &None); -} - -#[test] -fn test_interval_minimum_valid() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.set_min_interval(&60u64); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.interval, 3600); -} - -// ───────────────────────────────────────────── -// Multi-user isolation -// ───────────────────────────────────────────── - -#[test] -fn test_multiple_users() { - let (env, contract_id, token_addr, user_a, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let merchant_b = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount_a: i128 = 1_0000000; - let amount_b: i128 = 2_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant_a, - &amount_a, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant_b, - &amount_b, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.charge(&user_a); -} - -// ───────────────────────────────────────────── -// Cancel + charge edge cases -// ───────────────────────────────────────────── - -#[test] -#[should_panic] -fn test_charge_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - env.ledger().with_mut(|l| { - l.timestamp += 86401; - }); - - client.charge(&user); -} - -// ───────────────────────────────────────────── -// batch_charge tests -// ───────────────────────────────────────────── - -#[test] -fn test_batch_charge_charged_and_skipped() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let interval: u64 = 86400; - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Only advance past interval for user_a - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // user_b re-subscribes at the new timestamp so their interval hasn't elapsed - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); -} - -#[test] -fn test_batch_charge_ordering() { - let (env, contract_id, token_addr, user_1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_2 = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_2, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_2, &contract_id, &10_000_0000000, &200); - - let user_3 = Address::generate(&env); - // user_3 has no subscription - - let user_4 = Address::generate(&env); - sac.mint(&user_4, &10_000_0000000); - token.approve(&user_4, &contract_id, &10_000_0000000, &200); - - let interval = 86400; - - // user_1: valid, will be charged - client.subscribe( - &user_1, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // user_2: valid, will be charged - client.subscribe( - &user_2, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.subscribe( - &user_4, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) - users.push_back(user_2.clone()); - users.push_back(user_3.clone()); - users.push_back(user_4.clone()); - users.push_back(user_1.clone()); - - let results = client.batch_charge(&users); - - assert_eq!(results.len(), 4); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); - assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); -} - -#[test] -fn test_batch_charge_no_subscription() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let unknown = Address::generate(&env); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(unknown); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::NoSubscription); -} - -#[test] -#[cfg(feature = "bench")] -fn test_batch_charge_stress() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - env.budget().reset_unlimited(); - - let num_users = 50; - let mut users = soroban_sdk::Vec::new(&env); - let interval = 86400; - - for _ in 0..num_users { - let u = Address::generate(&env); - sac.mint(&u, &10_000_0000000); - token.approve(&u, &contract_id, &10_000_0000000, &200); - client.subscribe( - &u, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let results = client.batch_charge(&users); - - assert_eq!(results.len(), num_users); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } -} - -#[test] -#[cfg(feature = "bench")] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_over_default_limit_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - let u = Address::generate(&env); - users.push_back(u); - users.push_back(Address::generate(&env)); - } - - let res = client.try_batch_charge(&users); - assert!(res.is_err()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #29)")] -fn test_set_max_batch_size_rejects_value_above_200() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.set_max_batch_size(&201); -} - -#[test] -#[should_panic] -fn test_non_admin_set_max_batch_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.set_auths(&[]); - client.set_max_batch_size(&10); -} - -#[test] -fn test_cancel_and_refund_prorated_transfers_expected_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp = 900; - }); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - - client.cancel_and_refund_prorated(&user, &merchant); - - assert_eq!( - token.balance(&merchant), - merchant_balance_before - 7_500_000 - ); - assert_eq!(token.balance(&user), user_balance_before + 7_500_000); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active); -} - -#[test] -fn test_cancel_and_refund_prorated_at_period_start_refunds_full_amount() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - - client.cancel_and_refund_prorated(&user, &merchant); - - assert_eq!( - token.balance(&merchant), - merchant_balance_before - 1_0000000 - ); - assert_eq!(token.balance(&user), user_balance_before + 1_0000000); - assert!(!client.get_subscription(&user).unwrap().active); -} - -#[test] -#[should_panic(expected = "Error(Contract, #39)")] -fn test_cancel_and_refund_prorated_at_interval_end_rejects_zero_refund() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let sac = StellarAssetClient::new(&env, &token_addr); - - sac.mint(&merchant, &10_000_0000000); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp = 3600; - }); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -#[should_panic(expected = "Error(Contract, #38)")] -fn test_cancel_and_refund_prorated_rejects_wrong_merchant() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let actual_merchant = Address::generate(&env); - - client.subscribe( - &user, - &actual_merchant, - &1_0000000, - &3600, - &_token_addr, - &None, - &None, - ); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_cancel_and_refund_prorated_missing_subscription_panics() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.cancel_and_refund_prorated(&user, &merchant); -} - -#[test] -fn test_cancel_and_refund_prorated_underfunded_merchant_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| l.timestamp = 1800); - - let merchant_balance_before = token.balance(&merchant); - let user_balance_before = token.balance(&user); - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - assert_eq!(token.balance(&merchant), merchant_balance_before); - assert_eq!(token.balance(&user), user_balance_before); - assert!(client.get_subscription(&user).unwrap().active); -} - -#[test] -fn test_cancel_and_refund_prorated_inactive_subscription_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - assert!(!client.get_subscription(&user).unwrap().active); -} - -#[test] -fn test_cancel_and_refund_prorated_paused_subscription_is_atomic() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let result = client.try_cancel_and_refund_prorated(&user, &merchant); - - assert!(result.is_err()); - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert!(sub.paused); -} - -#[test] -fn test_batch_charge_inactive() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Inactive); -} - -/// batch_charge must return ChargeResult::Paused for a subscription that has been paused. -#[test] -fn test_batch_charge_paused() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Paused); -} - -/// Issue #201: batch_charge applies protocol fees identically to charge(). -#[test] -fn test_batch_charge_with_fee() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - let collector = Address::generate(&env); - let fee_bps: u32 = 100; // 1% - client.propose_fee(&collector, &fee_bps); - client.commit_fee(); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 10_000_000; // 1 XLM - let interval: u64 = 86400; - let expected_fee = amount * (fee_bps as i128) / 10_000; - let expected_net = amount - expected_fee; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_a_balance_before = token.balance(&user_a); - let user_b_balance_before = token.balance(&user_b); - let merchant_balance_before = token.balance(&merchant); - let collector_balance_before = token.balance(&collector); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Charged); - - assert_eq!( - user_a_balance_before - token.balance(&user_a), - amount, - "user_a debited gross amount" - ); - assert_eq!( - user_b_balance_before - token.balance(&user_b), - amount, - "user_b debited gross amount" - ); - assert_eq!( - token.balance(&merchant) - merchant_balance_before, - expected_net * 2, - "merchant receives net per user" - ); - assert_eq!( - token.balance(&collector) - collector_balance_before, - expected_fee * 2, - "collector receives fee per user" - ); -} - -#[test] -fn test_batch_charge_grace_period_elapsed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - let grace_period: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Advance ledger beyond interval + grace period - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - let results = client.batch_charge(&users); - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::GracePeriodElapsed - ); -} - -// ----------------------------------------------------------------- -// Issue #794: batch_charge AllowanceInsufficient tolerance tests -// ----------------------------------------------------------------- - -/// A subscriber with zero allowance receives AllowanceInsufficient; no funds move. -#[test] -fn test_batch_charge_zero_allowance_returns_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Revoke the allowance entirely. - token.approve(&user, &contract_id, &0, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "zero allowance must produce AllowanceInsufficient" - ); - assert_eq!(token.balance(&user), user_balance_before, "user balance unchanged"); - assert_eq!(token.balance(&merchant), merchant_balance_before, "merchant balance unchanged"); -} - -/// A subscriber whose allowance is exactly the subscription amount is charged. -#[test] -fn test_batch_charge_exact_allowance_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Set allowance to exactly the gross amount. - token.approve(&user, &contract_id, &amount, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::Charged, - "exact allowance must allow the charge" - ); - assert_eq!( - token.balance(&user), - 10_000_0000000 - amount, - "user debited gross amount" - ); -} - -/// A subscriber with allowance one stroop below sub.amount is rejected. -#[test] -fn test_batch_charge_one_below_allowance_returns_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Set allowance to one stroop below gross. - token.approve(&user, &contract_id, &(amount - 1), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient - ); - assert_eq!(token.balance(&user), user_balance_before); - assert_eq!(token.balance(&merchant), merchant_balance_before); -} - -/// Mixed batch: Alice (sufficient) -> Bob (insufficient) -> Charlie (sufficient). -/// Bob's failure must not abort Alice's or Charlie's charges. -#[test] -fn test_batch_charge_mixed_allowance_does_not_abort_healthy_users() { - let (env, contract_id, token_addr, alice, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let bob = Address::generate(&env); - let charlie = Address::generate(&env); - sac.mint(&bob, &10_000_0000000); - sac.mint(&charlie, &10_000_0000000); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - for u in [&alice, &bob, &charlie] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - } - - // Bob revokes to an insufficient amount. - token.approve(&bob, &contract_id, &(amount / 2), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let alice_before = token.balance(&alice); - let bob_before = token.balance(&bob); - let charlie_before = token.balance(&charlie); - let merchant_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(alice.clone()); - users.push_back(bob.clone()); - users.push_back(charlie.clone()); - - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged, "Alice charged"); - assert_eq!( - results.get(1).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "Bob insufficient" - ); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged, "Charlie charged"); - - assert_eq!(alice_before - token.balance(&alice), amount, "Alice debited"); - assert_eq!(token.balance(&bob), bob_before, "Bob untouched"); - assert_eq!(charlie_before - token.balance(&charlie), amount, "Charlie debited"); - assert_eq!( - token.balance(&merchant) - merchant_before, - amount * 2, - "merchant received exactly 2 charges" - ); -} - -/// Multiple under-allowanced users in one batch all return AllowanceInsufficient. -#[test] -fn test_batch_charge_multiple_insufficient_allowances() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let user_b = Address::generate(&env); - sac.mint(&user_b, &10_000_0000000); - - let amount: i128 = 2_0000000; - let interval: u64 = 86400; - - for u in [&user_a, &user_b] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - token.approve(u, &contract_id, &(amount - 1), &200); - } - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let a_before = token.balance(&user_a); - let b_before = token.balance(&user_b); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(token.balance(&user_a), a_before); - assert_eq!(token.balance(&user_b), b_before); -} - -/// Healthy user before AND after an under-allowanced user both get charged. -#[test] -fn test_batch_charge_healthy_before_and_after_insufficient() { - let (env, contract_id, token_addr, healthy_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - let insufficient = Address::generate(&env); - let healthy_b = Address::generate(&env); - sac.mint(&insufficient, &10_000_0000000); - sac.mint(&healthy_b, &10_000_0000000); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - for u in [&healthy_a, &insufficient, &healthy_b] { - token.approve(u, &contract_id, &10_000_0000000, &200); - client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); - } - - token.approve(&insufficient, &contract_id, &0, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let ha_before = token.balance(&healthy_a); - let hb_before = token.balance(&healthy_b); - let ins_before = token.balance(&insufficient); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(healthy_a.clone()); - users.push_back(insufficient.clone()); - users.push_back(healthy_b.clone()); - let results = client.batch_charge(&users); - - assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); - assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged); - - assert_eq!(ha_before - token.balance(&healthy_a), amount); - assert_eq!(token.balance(&insufficient), ins_before); - assert_eq!(hb_before - token.balance(&healthy_b), amount); -} - -/// Auto-resume + insufficient allowance: subscription resumes but charge fails cleanly. -#[test] -fn test_batch_charge_auto_resume_with_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - client.pause_until(&user, &90_000); - - // Revoke allowance while paused. - token.approve(&user, &contract_id, &0, &200); - - // Advance past both the pause expiry and the charge interval. - env.ledger().set_timestamp(90_001); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "auto-resume + zero allowance must not panic" - ); - assert_eq!(token.balance(&user), user_balance_before); - assert_eq!(token.balance(&merchant), merchant_balance_before); - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert!(!sub.paused); -} - -/// get_batch_charge_estimate returns AllowanceInsufficient for an under-allowanced -/// due subscriber, mirroring the live batch behavior. -#[test] -fn test_batch_charge_estimate_reflects_allowance_insufficient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - token.approve(&user, &contract_id, &(amount - 1), &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let users = soroban_sdk::vec![&env, user.clone()]; - let estimate = client.get_batch_charge_estimate(&users); - assert_eq!( - estimate.get(0).unwrap(), - crate::batch::ChargeResult::AllowanceInsufficient - ); -} - -/// Allowance check is against gross sub.amount, NOT the post-fee net amount. -/// Allowance == net (< gross) must still return AllowanceInsufficient. -#[test] -fn test_batch_charge_allowance_checked_against_gross_not_net() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let admin = Address::generate(&env); - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - crate::storage::set_admin(&env, &admin); - }); - // 10% fee: net = 90% of gross. - client.propose_fee(&collector, &1000); - client.commit_fee(); - - let gross: i128 = 1_0000000; - let net: i128 = gross - gross * 1000 / 10_000; // 9_000_000 - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &gross, &interval, &token_addr, &None, &None); - - // Set allowance to exactly the net amount -- below gross. - token.approve(&user, &contract_id, &net, &200); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let results = client.batch_charge(&users); - - assert_eq!( - results.get(0).unwrap(), - crate::ChargeResult::AllowanceInsufficient, - "allowance == net but < gross must still fail" - ); - assert_eq!(token.balance(&user), user_balance_before, "no funds moved"); -} - -// ───────────────────────────────────────────── -// subscription_count tests -// ───────────────────────────────────────────── - -#[test] -fn test_active_count_increments_on_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_active_count(), 0); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); -} - -#[test] -fn test_active_count_does_not_double_count_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - - client.subscribe( - &user, - &merchant_b, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.merchant, merchant_b); - assert_eq!(sub.amount, 2_0000000); -} - -#[test] -fn test_active_count_decrements_on_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 1); - client.cancel(&user); - assert_eq!(client.get_active_count(), 0); -} - -#[test] -fn test_active_count_multiple_users() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_active_count(), 2); - - client.cancel(&user_a); - assert_eq!(client.get_active_count(), 1); -} - -// ───────────────────────────────────────────── -// merchant_stats tests -// ───────────────────────────────────────────── - -#[test] -fn test_merchant_revenue_from_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_merchant_revenue(&merchant), 0); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_merchant_revenue(&merchant), amount); -} - -#[test] -fn test_merchant_revenue_from_pay_per_use() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &3_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); -} - -#[test] -fn test_merchant_revenue_accumulates() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 2_0000000; - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - client.pay_per_use(&user, &1_0000000); - - assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); -} - -// ───────────────────────────────────────────── -// spending_limit tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_daily_limit() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Initial limit should be None - assert_eq!(client.get_daily_limit(&user), None); - - // After setting, it should return Some(limit) - client.set_daily_limit(&user, &10_0000000); - assert_eq!(client.get_daily_limit(&user), Some(10_0000000)); -} - -#[test] -fn test_get_daily_limit_status_absent_limit() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!( - client.get_daily_limit_status(&user), - DailyLimitStatus { - limit: None, - spent: 0, - day_start: None, - remaining: None, - } - ); -} - -#[test] -fn test_get_daily_limit_status_snapshot_and_rollover() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - client.pay_per_use(&user, &2_0000000); - - let status = client.get_daily_limit_status(&user); - assert_eq!(status.limit, Some(10_0000000)); - assert_eq!(status.spent, 2_0000000); - assert_eq!(status.remaining, Some(8_0000000)); - assert_eq!(status.day_start, client.get_day_start(&user)); - - env.as_contract(&contract_id, || { - env.storage().temporary().extend_ttl( - &DataKey::DailyLimit(user.clone()), - 35000, - 35000, - ); - }); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += 17281; - }); - - assert_eq!( - client.get_daily_limit_status(&user), - DailyLimitStatus { - limit: Some(10_0000000), - spent: 0, - day_start: None, - remaining: Some(10_0000000), - } - ); -} - -#[test] -fn test_daily_limit_allows_spend_within_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &10_0000000); - // Should not panic - client.pay_per_use(&user, &5_0000000); -} - -#[test] -#[should_panic] -fn test_daily_limit_blocks_overspend() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &3_0000000); - client.pay_per_use(&user, &5_0000000); -} - -#[test] -fn test_daily_limit_accumulates_across_calls() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - client.pay_per_use(&user, &2_0000000); - client.pay_per_use(&user, &2_0000000); - // 4 total, limit is 5 — should pass -} - -#[test] -#[should_panic] -fn test_daily_limit_blocks_cumulative_overspend() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - client.pay_per_use(&user, &3_0000000); - client.pay_per_use(&user, &3_0000000); // 6 total > 5 limit -} - -#[test] -fn test_daily_limit_visibility_and_spend_tracking() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_daily_limit(&user), None); - assert_eq!(client.get_daily_spent(&user), 0); - - client.set_daily_limit(&user, &4_0000000); - assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); - - client.pay_per_use(&user, &1_0000000); - assert_eq!(client.get_daily_spent(&user), 1_0000000); - assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); -} - -#[test] -fn test_get_day_start_visibility() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // No window before any spend - assert!(client.get_day_start(&user).is_none()); - assert_eq!(client.get_daily_spent(&user), 0); - - client.set_daily_limit(&user, &10_0000000); - // Setting a limit alone does not open the day window - assert!(client.get_day_start(&user).is_none()); - - client.pay_per_use(&user, &2_0000000); - assert!(client.get_day_start(&user).is_some()); - assert_eq!(client.get_daily_spent(&user), 2_0000000); - - client.remove_daily_limit(&user); - assert!(client.get_day_start(&user).is_none()); - assert_eq!(client.get_daily_spent(&user), 0); -} - -#[test] -fn test_daily_limit_set_event_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.set_daily_limit(&user, &4_0000000); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let limit: i128 = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "daily_limit_set")); - assert_eq!(topic_user, user); - assert_eq!(limit, 4_0000000); -} - -#[test] -fn test_daily_limit_removed_event_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.set_daily_limit(&user, &4_0000000); - client.remove_daily_limit(&user); - - assert_eq!(client.get_daily_limit(&user), None); - assert_last_user_event(&env, "daily_limit_removed", &user); -} - -#[test] -fn test_remove_daily_limit_allows_pay_per_use_after_removal() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &3_0000000); - client.pay_per_use(&user, &2_0000000); - client.remove_daily_limit(&user); - client.pay_per_use(&user, &2_0000000); // should succeed after removal -} - -// ───────────────────────────────────────────── -// Contract admin event tests -// ───────────────────────────────────────────── - -#[test] -fn test_contract_pause_events_emitted() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.pause_contract(); - assert!(client.is_contract_paused()); - assert_last_event(&env, "contract_paused"); - - client.unpause_contract(); - assert!(!client.is_contract_paused()); - assert_last_event(&env, "contract_unpaused"); -} - -// ───────────────────────────────────────────── -// Migration tests -// ───────────────────────────────────────────── - -#[test] -fn test_migrate_v1_to_v2() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::SchemaVersion, &1u32); - }); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Manually construct and store a V1 subscription - let v1_sub = crate::migration::SubscriptionV1 { - merchant: merchant.clone(), - amount: 1_0000000, - interval: 86400, - last_charged: env.ledger().timestamp(), - active: true, - token: token_addr.clone(), - referrer: None, - label: Symbol::new(&env, "v1_label"), - trial_duration: 0, - }; - - env.as_contract(&contract_id, || { - env.storage() - .persistent() - .set(&crate::DataKey::Subscription(user.clone()), &v1_sub); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - client.migrate(&users); - - // Verify it was upgraded to V2 - let v2_sub = client.get_subscription(&user).unwrap(); - assert_eq!(v2_sub.merchant, merchant); - assert_eq!(v2_sub.amount, 1_0000000); - assert_eq!(v2_sub.active, true); - assert_eq!(v2_sub.paused, false); // This is the newly added field - assert_eq!(v2_sub.label, Symbol::new(&env, "v1_label")); -} - -#[test] -fn test_admin_batch_pause_subscriptions_freezes_multiple_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - client.batch_pause_subscriptions(&users); - - assert!(client.get_subscription(&user_a).unwrap().paused); - assert!(client.get_subscription(&user_b).unwrap().paused); - assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); - assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 1); -} - -#[test] -#[should_panic] -fn test_batch_pause_subscriptions_requires_admin_auth() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let admin = Address::generate(&env); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = Vec::new(&env); - users.push_back(user); - - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let missing_user = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user_b); - - let mut users = Vec::new(&env); - users.push_back(missing_user.clone()); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - client.batch_pause_subscriptions(&users); - - assert!(client.get_subscription(&user_a).unwrap().paused); - assert!(client.get_subscription(&user_b).unwrap().paused); - assert!(client.get_subscription(&missing_user).is_none()); - assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); - assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 0); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let mut users = Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_upgrade_event_emitted() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[7; 32]); - client.upgrade(&new_wasm_hash); - - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let mock_wasm_hash = BytesN::from_array(&env, &[0u8; 32]); - env.as_contract(&contract_id, || { - events::publish_upgraded(&env, &mock_wasm_hash); - }); - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "upgrade")); -} - -// ───────────────────────────────────────────────────────────── -// Issue #45: get_pending_upgrade tests -// ───────────────────────────────────────────────────────────── - -/// Returns None when no upgrade has been proposed. -#[test] -fn test_get_pending_upgrade_none_when_not_proposed() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - assert_eq!(client.get_pending_upgrade(), None); -} - -/// Returns the proposed WASM hash after propose_upgrade is called. -#[test] -fn test_get_pending_upgrade_returns_proposed_hash() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xAB; 32]); - client.propose_upgrade(&new_wasm_hash); - - assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); -} - -/// Returns None after commit_upgrade consumes the pending hash. -#[test] -fn test_get_pending_upgrade_none_after_commit() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xCD; 32]); - client.propose_upgrade(&new_wasm_hash); - - // Hash is visible before commit - assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); - - client.commit_upgrade(); - - // Cleared after commit - assert_eq!(client.get_pending_upgrade(), None); -} - -#[test] -fn test_cancel_pending_upgrade_clears_pending_upgrade_and_emits_event() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let new_wasm_hash = BytesN::from_array(&env, &[0xEF; 32]); - client.propose_upgrade(&new_wasm_hash); - client.cancel_pending_upgrade(); - - assert_eq!(client.get_pending_upgrade(), None); - assert_last_event(&env, "upg_cancelled"); -} - -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_commit_upgrade_requires_pending_upgrade_after_cancel() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); - client.cancel_pending_upgrade(); - client.commit_upgrade(); -} - -#[test] -fn test_pending_upgrade_expires() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS + 1; - }); - - assert_eq!(client.get_pending_upgrade(), None); -} - -#[test] -fn test_repropose_refreshes_pending_upgrade_ttl() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let first_hash = BytesN::from_array(&env, &[0x01; 32]); - let second_hash = BytesN::from_array(&env, &[0x02; 32]); - client.propose_upgrade(&first_hash); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; - }); - client.propose_upgrade(&second_hash); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; - }); - - assert_eq!(client.get_pending_upgrade(), Some(second_hash)); -} - -/// A second propose_upgrade overwrites the first pending hash. -#[test] -fn test_get_pending_upgrade_overwritten_by_second_proposal() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let hash_a = BytesN::from_array(&env, &[0x01; 32]); - let hash_b = BytesN::from_array(&env, &[0x02; 32]); - - client.propose_upgrade(&hash_a); - assert_eq!(client.get_pending_upgrade(), Some(hash_a)); - - client.propose_upgrade(&hash_b); - assert_eq!(client.get_pending_upgrade(), Some(hash_b)); -} -// ───────────────────────────────────────────── -// ───────────────────────────────────────────────────────────── -// Issue #96: referral tracking tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_referral_stored_on_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - - assert_eq!(client.get_referrer(&user), Some(referrer)); -} - -#[test] -fn test_no_referral_returns_none() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert!(client.get_referrer(&user).is_none()); -} - -#[test] -fn test_referral_updates_on_resubscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer_a = Address::generate(&env); - let referrer_b = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer_a.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer_a)); - - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &Some(referrer_b.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer_b)); -} - -#[test] -fn test_grace_period_ttl_extension() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Ensure an admin is set so admin checks pass. - let admin = Address::generate(&env); - // Write admin as the contract to set instance storage from the test harness. - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - // Set a grace period as admin and verify read returns the same value. - let seconds: u64 = 3600; - client.propose_grace_period(&seconds); - client.commit_grace_period(); - let got = client.get_grace_period(); - assert_eq!(got, seconds); -} - -#[test] -#[should_panic(expected = "Error(Contract, #1)")] -fn test_double_initialize() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.initialize(&token_addr, &admin); -} - -// ───────────────────────────────────────────── -// Issue #839 / Issue 044: deploy-facing initialize invariants -// Relied on by scripts/deploy-pipeline.ts and scripts/testnet-setup.ts. -// Signature must remain initialize(token, admin). Failures that scripts map -// must be ContractError (AlreadyInitialized = 1), not a host string panic. -// ───────────────────────────────────────────── - -/// Successful initialize persists both the default token and the admin. -/// Deploy health checks require `token_configured` and `admin_configured`. -#[test] -fn test_initialize_deploy_invariant_persists_token_and_admin() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - - assert_eq!( - client.get_token(), - Some(token_addr.clone()), - "initialize must persist the token readable via get_token" - ); - assert_eq!( - client.get_admin(), - Some(admin.clone()), - "initialize must persist the admin readable via get_admin" - ); - - let report = client.contract_health_check(); - assert!(report.token_configured); - assert!(report.admin_configured); -} - -/// Every published error code remains stable on the Soroban wire format. -#[test] -fn test_published_error_code_mapping() { - use crate::errors::ContractError; - - let published = [ - (ContractError::AlreadyInitialized, 1), - (ContractError::AmountMustBePositive, 2), - (ContractError::IntervalMustBePositive, 3), - (ContractError::NoSubscriptionFound, 4), - (ContractError::SubscriptionInactive, 5), - (ContractError::IntervalNotElapsed, 6), - (ContractError::NotInitialized, 7), - (ContractError::InsufficientAllowance, 8), - (ContractError::GracePeriodElapsed, 9), - (ContractError::MerchantNotWhitelisted, 10), - (ContractError::SelfReferral, 11), - (ContractError::InvalidTokenAddress, 12), - (ContractError::InvalidFeeBps, 13), - (ContractError::MetadataLabelTooLong, 14), - (ContractError::AmountExceedsMaximum, 15), - (ContractError::SubscriptionNotActive, 16), - (ContractError::SubscriptionPaused, 17), - (ContractError::ContractPaused, 18), - (ContractError::IntervalTooShort, 19), - (ContractError::BatchTooLarge, 20), - (ContractError::ZeroBalanceAvailable, 21), - (ContractError::MerchantFrozen, 22), - (ContractError::NoPendingProposal, 23), - (ContractError::SubscriptionAlreadyActive, 24), - (ContractError::DailyLimitExceeded, 25), - (ContractError::InvalidFeeCollector, 26), - (ContractError::InvalidPauseExpiry, 27), - (ContractError::GlobalVolumeExceeded, 28), - (ContractError::InvalidBatchSize, 29), - (ContractError::InvalidRecipient, 32), - (ContractError::InvalidVolumeCap, 33), - (ContractError::InvalidFeeBounds, 34), - (ContractError::FeeOutOfBoundsAtCommit, 35), - (ContractError::ArithmeticOverflow, 36), - (ContractError::RefundMerchantMismatch, 38), - (ContractError::RefundAmountMustBePositive, 39), - (ContractError::InsufficientMerchantBalance, 40), - (ContractError::CannotClearActiveSubscriber, 41), - (ContractError::SchemaMigrationRequired, 42), - (ContractError::ResumeGraceLapsed, 43), - ]; - - for (error, code) in published { - assert_eq!(error as u32, code); - assert_eq!(soroban_sdk::Error::from_contract_error(code), soroban_sdk::Error::from_contract_error(error as u32)); - } - - // Code 30 remains source-compatible for clients that referenced the old - // variant, but no current pause path emits it. Code 31 is intentionally - // reserved and has no current enum variant. - #[allow(deprecated)] - { - assert_eq!(ContractError::ContractPausedError as u32, 30); - } - assert!(!published.iter().any(|(_, code)| *code == 31)); - assert!(!published.iter().any(|(_, code)| *code == 30)); -} - -/// Storage read used by deploy scripts: get_admin returns the initialized admin. -#[test] -fn test_initialize_deploy_invariant_stored_admin() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_admin().is_none()); - client.initialize(&token_addr, &admin); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// Storage read used by deploy scripts: get_token returns the initialized token. -#[test] -fn test_initialize_deploy_invariant_stored_token() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_token().is_none()); - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); -} - -/// A second initialize must return typed AlreadyInitialized (code 1), not a string panic. -#[test] -fn test_initialize_deploy_invariant_double_init_already_initialized() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - - let result = client.try_initialize(&token_addr, &admin); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AlreadyInitialized as u32 - ))), - "double initialize must map to ContractError::AlreadyInitialized" - ); - - // First initialize state is unchanged. - assert_eq!(client.get_token(), Some(token_addr)); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// Initialize without admin authorization must fail and must not persist token or admin. -#[test] -fn test_initialize_deploy_invariant_requires_admin_auth() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.set_auths(&[]); - - let result = client.try_initialize(&token_addr, &admin); - assert!(result.is_err(), "initialize without admin auth must fail"); - assert_ne!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AlreadyInitialized as u32 - ))), - "missing admin auth is an authorization failure, not AlreadyInitialized" - ); - - assert!( - client.get_token().is_none(), - "failed initialize must not persist token" - ); - assert!( - client.get_admin().is_none(), - "failed initialize must not persist admin" - ); -} - -/// Backward-compat: current initialize(token, admin) arity remains the deploy entrypoint. -#[test] -fn test_initialize_deploy_invariant_token_admin_signature() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); - assert_eq!(client.get_admin(), Some(admin)); -} - -#[test] -fn test_referral_clears_on_resubscribe_with_none() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let referrer = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referrer(&user), Some(referrer)); - - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - assert!(client.get_referrer(&user).is_none()); -} - -#[test] -fn test_self_referral_rejected_via_try_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(user.clone()), - ); - - assert_eq!(result, Err(Ok(soroban_sdk::Error::from_contract_error(11)))); -} - -// ───────────────────────────────────────────── -// Issue #97: migration tests -// ───────────────────────────────────────────── - -#[test] -fn test_migrate_sets_schema_version() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Fresh contract starts at schema version 0 before migration. - assert_eq!(client.get_schema_version(), 0); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - - assert_eq!(client.get_schema_version(), 3); -} - -#[test] -fn test_migrate_is_idempotent() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - client.migrate(&empty_users); // second call should be a no-op - - assert_eq!(client.get_schema_version(), 3); -} - -// ───────────────────────────────────────────── -#[test] -#[should_panic] -fn test_migrate_non_admin_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - env.set_auths(&[]); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.migrate(&users); -} - -#[test] -fn test_migrate_emits_completed_event_with_version_and_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &2u32); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.migrate(&users); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (version, user_count): (u32, u32) = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "migration_completed")); - assert_eq!(version, 3); - assert_eq!(user_count, 1); -} - -// ───────────────────────────────────────────── -// Issue #99: subscription metadata tests -// ───────────────────────────────────────────── - -#[test] -fn test_set_and_get_metadata() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let label = soroban_sdk::String::from_str(&env, "pro"); - client.set_metadata(&user, &label); - - assert_eq!(client.get_metadata(&user), Some(label)); -} - -#[test] -fn test_clear_metadata_removes_label() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let label = soroban_sdk::String::from_str(&env, "pro"); - client.set_metadata(&user, &label); - assert_eq!(client.get_metadata(&user), Some(label)); - - client.clear_metadata(&user); - - assert!(client.get_metadata(&user).is_none()); -} - -#[test] -fn test_get_metadata_none_when_not_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!(client.get_metadata(&random).is_none()); -} - -// ───────────────────────────────────────────── -// Issue #98: charge history tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_charge_history_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. A fresh user with no subscription/no charges ever → count is 0. - let fresh_user = Address::generate(&env); - assert_eq!(client.get_charge_history_count(&fresh_user), 0); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Also checking count for user with active subscription but no charges yet - assert_eq!(client.get_charge_history_count(&user), 0); - - // 2. Count increments by 1 correctly after each individual charge event. - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - assert_eq!(client.get_charge_history_count(&user), 1); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - assert_eq!(client.get_charge_history_count(&user), 2); - - // Charge more to get exactly 12 entries - for _ in 0..10 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - // 5. (Edge case) A user with exactly 12 entries → returns exactly 12. - assert_eq!(client.get_charge_history_count(&user), 12); - - // 3. Count caps at 12 and does not exceed it even after more than 12 charges have occurred. - for _ in 0..5 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - assert_eq!(client.get_charge_history_count(&user), 12); - - // 4. After calling clear_charge_history for a user who had history, count returns to 0. - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.clear_charge_history(&user); - assert_eq!(client.get_charge_history_count(&user), 0); -} - -#[test] -fn test_charge_history_recorded() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_charge_history(&user).len(), 0); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_charge_history(&user).len(), 1); -} - -#[test] -fn test_charge_history_capped_at_12() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Perform 14 charges - for _ in 0..14 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - assert_eq!(client.get_charge_history(&user).len(), 12); -} - -#[test] -fn test_get_charge_history_three_charges_ascending() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t1 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t2 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t3 = env.ledger().timestamp(); - - let history = client.get_charge_history(&user); - assert_eq!(history.len(), 3); - assert_eq!(history.get(0).unwrap(), t1); - assert_eq!(history.get(1).unwrap(), t2); - assert_eq!(history.get(2).unwrap(), t3); -} - -#[test] -fn test_get_charge_history_page_offset_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t1 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t2 = env.ledger().timestamp(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t3 = env.ledger().timestamp(); - - let page = client.get_charge_history_page(&user, &1u32, &2u32, &true); - assert_eq!(page.len(), 2); - assert_eq!(page.get(0).unwrap(), t2); - assert_eq!(page.get(1).unwrap(), t3); -} - -#[test] -#[should_panic] -fn test_clear_charge_history_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - client.clear_charge_history(&user); -} - -#[test] -fn test_clear_charge_history_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - assert_eq!(client.get_charge_history(&user).len(), 1); - - client.clear_charge_history(&user); - - assert_eq!(client.get_charge_history(&user).len(), 0); -} - -#[test] -fn test_get_charge_history_empty_for_no_history() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - let history = client.get_charge_history(&random); - assert_eq!(history.len(), 0); -} - -#[test] -fn test_get_charge_history_page_limit_capped_at_12() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - for _ in 0..14 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - } - - let page = client.get_charge_history_page(&user, &0u32, &100u32, &true); - assert_eq!(page.len(), 12); -} - -#[test] -fn test_get_charge_history_page_offset_beyond_length() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - let page = client.get_charge_history_page(&user, &5u32, &2u32, &true); - assert_eq!(page.len(), 0); -} - -#[test] -fn test_charge_history_sort_ascending_and_descending() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let mut timestamps = Vec::new(&env); - for _ in 0..5 { - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - timestamps.push_back(env.ledger().timestamp()); - } - - let t0 = timestamps.get(0).unwrap(); - let t1 = timestamps.get(1).unwrap(); - let t2 = timestamps.get(2).unwrap(); - let t3 = timestamps.get(3).unwrap(); - let t4 = timestamps.get(4).unwrap(); - - // Ascending (true) full page: [t0, t1, t2, t3, t4] - let asc_all = client.get_charge_history_page(&user, &0u32, &10u32, &true); - assert_eq!(asc_all.len(), 5); - assert_eq!(asc_all.get(0).unwrap(), t0); - assert_eq!(asc_all.get(1).unwrap(), t1); - assert_eq!(asc_all.get(2).unwrap(), t2); - assert_eq!(asc_all.get(3).unwrap(), t3); - assert_eq!(asc_all.get(4).unwrap(), t4); - - // Descending (false) full page: [t4, t3, t2, t1, t0] - let desc_all = client.get_charge_history_page(&user, &0u32, &10u32, &false); - assert_eq!(desc_all.len(), 5); - assert_eq!(desc_all.get(0).unwrap(), t4); - assert_eq!(desc_all.get(1).unwrap(), t3); - assert_eq!(desc_all.get(2).unwrap(), t2); - assert_eq!(desc_all.get(3).unwrap(), t1); - assert_eq!(desc_all.get(4).unwrap(), t0); - - // Pagination in ascending direction: - let asc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &true); - assert_eq!(asc_p1.len(), 2); - assert_eq!(asc_p1.get(0).unwrap(), t0); - assert_eq!(asc_p1.get(1).unwrap(), t1); - - let asc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &true); - assert_eq!(asc_p2.len(), 2); - assert_eq!(asc_p2.get(0).unwrap(), t2); - assert_eq!(asc_p2.get(1).unwrap(), t3); - - let asc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &true); - assert_eq!(asc_p3.len(), 1); - assert_eq!(asc_p3.get(0).unwrap(), t4); - - let asc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &true); - assert_eq!(asc_p4.len(), 0); - - // Pagination in descending direction: - let desc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &false); - assert_eq!(desc_p1.len(), 2); - assert_eq!(desc_p1.get(0).unwrap(), t4); - assert_eq!(desc_p1.get(1).unwrap(), t3); - - let desc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &false); - assert_eq!(desc_p2.len(), 2); - assert_eq!(desc_p2.get(0).unwrap(), t2); - assert_eq!(desc_p2.get(1).unwrap(), t1); - - let desc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &false); - assert_eq!(desc_p3.len(), 1); - assert_eq!(desc_p3.get(0).unwrap(), t0); - - let desc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &false); - assert_eq!(desc_p4.len(), 0); -} - -#[test] -fn test_charge_history_sort_edge_cases() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - // Empty history - assert_eq!( - client - .get_charge_history_page(&random, &0u32, &10u32, &true) - .len(), - 0 - ); - assert_eq!( - client - .get_charge_history_page(&random, &0u32, &10u32, &false) - .len(), - 0 - ); - assert_eq!( - client - .get_charge_history_page(&random, &5u32, &10u32, &false) - .len(), - 0 - ); - - // Single entry - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - let t0 = env.ledger().timestamp(); - - let asc_single = client.get_charge_history_page(&user, &0u32, &10u32, &true); - let desc_single = client.get_charge_history_page(&user, &0u32, &10u32, &false); - assert_eq!(asc_single.len(), 1); - assert_eq!(desc_single.len(), 1); - assert_eq!(asc_single.get(0).unwrap(), t0); - assert_eq!(desc_single.get(0).unwrap(), t0); -} - -#[test] -fn test_clear_charge_history_nonexistent_key_no_panic() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.clear_charge_history(&random); -} - -// ───────────────────────────────────────────── -// contract_health_check tests -// ───────────────────────────────────────────── - -#[test] -fn test_health_check_initialized_unpaused() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - - assert!( - report.is_healthy, - "initialized and unpaused contract should be healthy" - ); - assert!(!report.contract_paused); - assert!(report.token_configured); - assert!(report.admin_configured); -} - -#[test] -fn test_health_check_paused() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - client.pause_contract(); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy, "paused contract should not be healthy"); - assert!(report.contract_paused); -} - -#[test] -fn test_health_check_pre_initialize() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let report = client.contract_health_check(); - - assert!( - !report.token_configured, - "token should not be configured before initialize" - ); - assert!( - !report.is_healthy, - "uninitialized contract should not be healthy" - ); -} - -#[test] -fn test_health_check_active_subscription_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let report = client.contract_health_check(); - assert_eq!(report.active_subscription_count, 1); -} - -// ───────────────────────────────────────────── -// Issue 010: HealthReport field cleanup tests -// ───────────────────────────────────────────── - -#[test] -fn test_health_check_healthy_fully_configured() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - - assert!(report.is_healthy); - assert!(!report.contract_paused); - assert!(report.token_configured); - assert!(report.admin_configured); - assert!(report.instance_ttl_ledgers > 0); - // pending_merchant_rev_count is 0 when no merchants have revenue - assert_eq!(report.pending_merchant_rev_count, 0); -} - -#[test] -fn test_health_check_paused_not_healthy() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.pause_contract(); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy); - assert!(report.contract_paused); -} - -#[test] -fn test_health_check_unconfigured_not_healthy() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let report = client.contract_health_check(); - - assert!(!report.is_healthy); - assert!(!report.token_configured); - assert!(!report.admin_configured); -} - -/// Verify that TTL is reported as a positive value (test builds use real get_ttl). -#[test] -fn test_health_check_ttl_is_positive() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let report = client.contract_health_check(); - assert!( - report.instance_ttl_ledgers > 0, - "instance_ttl_ledgers should be positive in test builds" - ); -} - -#[test] -fn test_ttl_extension() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // We can't easily assert the exact TTL in the test environment without more complex mock_all_auths - // or internal access, but we can verify the function exists and doesn't panic. - - // Keep the contract instance itself alive across the jump below — only the - // Subscription entry's TTL is extended by extend_subscription_ttl, but the - // contract instance needs its own TTL or the whole contract becomes archived. - // Extend a bit past SUBSCRIPTION_TTL_LEDGERS to cover the two ledger jumps below. - env.as_contract(&contract_id, || { - env.storage() - .instance() - .extend_ttl(SUBSCRIPTION_TTL_LEDGERS + 10, SUBSCRIPTION_TTL_LEDGERS + 10); - }); - - env.ledger().with_mut(|l| { - l.sequence_number += SUBSCRIPTION_TTL_LEDGERS - 1; - }); - - client.extend_subscription_ttl(&user); - - assert!(client.get_subscription(&user).is_some()); -} - -// ───────────────────────────────────────────── -// Issue 013: PauseExpiry TTL coupled with subscription bump -// ───────────────────────────────────────────── - -#[test] -fn test_bump_subscription_extends_pause_expiry_when_present() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - // Verify PauseExpiry exists before bump - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should exist after pause_until"); - }); - - // Bump subscription TTL — should also bump PauseExpiry - client.bump_subscription(&user); - - // PauseExpiry should still exist (not archived) - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should survive bump_subscription"); - assert_eq!(expiry.unwrap(), 90000); - }); -} - -#[test] -fn test_bump_subscription_no_op_on_absent_pause_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - // No PauseExpiry — bump should be a safe no-op - client.bump_subscription(&user); - - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(expiry, None, "PauseExpiry should remain absent"); - }); -} - -#[test] -fn test_batch_extend_extends_pause_expiry_when_present() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &200000); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_extend_subscription_ttl(&users); - - // PauseExpiry should survive batch extend - env.as_contract(&contract_id, || { - let expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert!(expiry.is_some(), "PauseExpiry should survive batch_extend"); - assert_eq!(expiry.unwrap(), 200000); - }); -} - -#[test] -fn test_pause_then_batch_extend_then_auto_resume() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.ledger().with_mut(|l| { - l.max_entry_ttl = 10_000_000; - }); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - // Batch extend keeps PauseExpiry alive - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_extend_subscription_ttl(&users); - - // Advance to expiry — auto-resume should still work - env.ledger().set_timestamp(90000); - let mut users2 = soroban_sdk::Vec::new(&env); - users2.push_back(user.clone()); - let result = client.batch_charge(&users2); - assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); -} - -// ───────────────────────────────────────────── -// CONTRACT-22: bump_instance_ttl tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_extends_instance_ttl() { - use soroban_sdk::testutils::storage::Instance as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS / 2); -} - -#[test] -fn test_initialize_sets_instance_ttl() { - use soroban_sdk::testutils::storage::Instance as _; - - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin); - let admin = Address::generate(&env); - - client.initialize(&token_id.address(), &admin); - - let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl > 0); -} - -#[test] -fn test_bump_instance_ttl_is_permissionless_and_state_preserving() { - use soroban_sdk::testutils::storage::Instance as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - env.ledger().with_mut(|ledger| { - ledger.max_entry_ttl = SUBSCRIPTION_TTL_LEDGERS * 2; - }); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let admin_before = client.get_admin(); - let token_before = client.get_token(); - let fee_before = client.get_fee(); - let subscription_before = client.get_subscription(&user); - env.ledger().with_mut(|ledger| { - ledger.sequence_number += SUBSCRIPTION_TTL_LEDGERS / 2 + 100; - }); - let ttl_before = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - - env.set_auths(&[]); - client.bump_instance_ttl(); - - let ttl_after = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(ttl_after > ttl_before); - assert!(ttl_after >= SUBSCRIPTION_TTL_LEDGERS); - assert_eq!(client.get_admin(), admin_before); - assert_eq!(client.get_token(), token_before); - assert_eq!(client.get_fee(), fee_before); - assert_eq!(client.get_subscription(&user), subscription_before); - - client.bump_instance_ttl(); - let repeated_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); - assert!(repeated_ttl >= ttl_after); -} - -#[test] -#[should_panic] -fn test_subscribe_interval_under_60_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); -} - -#[test] -fn test_subscribe_interval_minimum_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - client.set_min_interval(&60u64); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &3600, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.interval, 3600); -} - -#[test] -#[should_panic(expected = "Error(Contract, #15)")] -fn test_subscribe_amount_above_cap_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &(MAX_SUBSCRIPTION_AMOUNT + 1)); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &(MAX_SUBSCRIPTION_AMOUNT + 1), &200); - - client.subscribe( - &user, - &merchant, - &(MAX_SUBSCRIPTION_AMOUNT + 1), - &86400, - &token_addr, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_amount_at_cap_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &MAX_SUBSCRIPTION_AMOUNT); - let token = soroban_sdk::token::Client::new(&env, &token_addr); - token.approve(&user, &contract_id, &MAX_SUBSCRIPTION_AMOUNT, &200); - - client.subscribe( - &user, - &merchant, - &MAX_SUBSCRIPTION_AMOUNT, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user, - &merchant, - &MAX_SUBSCRIPTION_AMOUNT, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.amount, MAX_SUBSCRIPTION_AMOUNT); -} - -// ───────────────────────────────────────────── -// Admin transfer tests -// ───────────────────────────────────────────── - -#[test] -fn test_transfer_admin() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - // Step 1: propose - client.transfer_admin(&new_admin); - // Step 2: accept - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_eq!(current_admin, new_admin); -} - -#[test] -fn test_transfer_admin_event_emitted() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - client.transfer_admin(&new_admin); - client.accept_admin(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (emitted_old_admin, emitted_new_admin): (Address, Address) = - data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "admin_transferred")); - assert_eq!(emitted_old_admin, old_admin); - assert_eq!(emitted_new_admin, new_admin); -} - -#[test] -fn test_transfer_admin_requires_auth() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - - client.transfer_admin(&new_admin); - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_eq!(current_admin, new_admin); -} - -#[test] -fn test_old_admin_loses_access_after_transfer() { - let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &old_admin); - }); - - let new_admin = Address::generate(&env); - client.transfer_admin(&new_admin); - client.accept_admin(); - - let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); - assert_ne!(current_admin, old_admin); -} - -#[test] -#[should_panic] -fn test_accept_admin_without_proposal_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.accept_admin(); -} - -#[test] -fn test_initialize_without_valid_token() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - - // Using a user address instead of a token contract address. - // The contract currently does not validate if the address is a valid token contract - // or even if it's a contract at all. - let invalid_token = Address::generate(&env); - let admin = Address::generate(&env); - - client.initialize(&invalid_token, &admin); - - // Success means it didn't panic, which is the current expected behavior. -} - -// ───────────────────────────────────────────── -// Global volume cap tests -// ───────────────────────────────────────────── - -/// Helper: set up a user with a large balance for global volume testing -fn setup_large_balance(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &100_000_000_000_000); - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &100_000_000_000_000, &200000); - user -} - -#[test] -fn test_global_volume_within_limit() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_000_0000000; // well under limit - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - // Should succeed - well under the 50 trillion stroops limit -} - -#[test] -#[should_panic] -fn test_global_volume_exceeds_limit() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Give users large balances to exceed the 50_000_000_000_000 limit - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 30_000_000_000_000; // 30 trillion stroops each - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // First charge succeeds (30 trillion used) - client.charge(&user_a); - - // Second charge should panic (60 trillion total > 50 trillion limit) - client.charge(&user_b); -} - -#[test] -fn test_global_volume_window_reset() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 1_000_0000000; // well under MAX_AMOUNT - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user_a); // 5 trillion used this window - - // Advance time past the 1-hour window boundary (3601 seconds) - env.ledger().with_mut(|l| { - l.timestamp += 3601; - }); - - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - - // This charge should succeed because the window has reset - client.charge(&user_b); -} - -// ───────────────────────────────────────────── -// Issue #10: get_global_volume_window tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_global_volume_window_returns_zero_on_fresh_contract() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let (volume, window_start) = client.get_global_volume_window(); - assert_eq!(volume, 0, "accumulated volume should be 0 on fresh contract"); - assert_eq!(window_start, 0, "window start should be 0 on fresh contract"); -} - -#[test] -fn test_get_global_volume_window_correct_values_after_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_000_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - let charge_time = env.ledger().timestamp(); - client.charge(&user); - - let (volume, window_start) = client.get_global_volume_window(); - assert_eq!(volume, amount, "accumulated volume should equal the charged amount"); - assert_eq!(window_start, charge_time, "window_start should equal ledger timestamp at charge time"); -} - -#[test] -fn test_get_global_volume_window_resets_after_hour() { - let (env, contract_id, token_addr, _user_setup, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_a = setup_large_balance(&env, &contract_id, &token_addr); - let user_b = setup_large_balance(&env, &contract_id, &token_addr); - - let amount: i128 = 1_000_0000000; - let interval: u64 = 86400; - - client.subscribe(&user_a, &merchant, &amount, &interval, &token_addr, &None, &None); - client.subscribe(&user_b, &merchant, &amount, &interval, &token_addr, &None, &None); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user_a); - - // Confirm volume accumulated in the first window - let (volume_before, _) = client.get_global_volume_window(); - assert_eq!(volume_before, amount); - - // Advance past the 1-hour window boundary - env.ledger().with_mut(|l| { - l.timestamp += 3601; - }); - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - let second_charge_time = env.ledger().timestamp(); - client.charge(&user_b); - - // Window should have reset: only the second charge amount is accumulated - let (volume_after, window_start_after) = client.get_global_volume_window(); - assert_eq!(volume_after, amount, "volume should reset to just the new charge amount after window expiry"); - assert_eq!(window_start_after, second_charge_time, "window_start should be the new charge time after reset"); -} - - - -// ───────────────────────────────────────────── -// subscribe_with_metadata tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscribe_with_metadata_success() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let label = soroban_sdk::String::from_str(&env, "Pro Plan"); - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe_with_metadata( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - &label, - ); - - // Verify subscription is created - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - - // Verify metadata is set - assert_eq!(client.get_metadata(&user), Some(label)); -} - -#[test] -#[should_panic] -fn test_subscribe_with_metadata_label_too_long() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Create a 65-byte label (exceeds 64-byte limit) - let long_label = soroban_sdk::String::from_str( - &env, - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", // 65 chars - ); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - // Should panic with MetadataLabelTooLong - client.subscribe_with_metadata( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - &long_label, - ); -} - -#[test] -#[should_panic] -fn test_subscribe_with_metadata_no_subscription_on_label_failure() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let long_label = soroban_sdk::String::from_str( - &env, - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", - ); - - // Label validation happens before subscribe_inner, so no subscription should be written. - // This panics before any storage write — we verify that by catching the panic separately - // in test_subscribe_with_metadata_label_too_long. Here we just assert the panic occurs. - client.subscribe_with_metadata( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - &long_label, - ); -} - -// ───────────────────────────────────────────── -// get_protocol_stats tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_protocol_stats_initial() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let stats = client.get_protocol_stats(); - - assert_eq!(stats.active_count, 0); - assert_eq!(stats.fee_bps, 0); - assert!(stats.fee_collector.is_none()); - assert_eq!(stats.grace_period, 0); - assert!(!stats.whitelist_enabled); - assert_eq!(stats.schema_version, 3); // setup uses the current schema - assert!(!stats.contract_paused); -} - -#[test] -fn test_get_protocol_stats_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let stats = client.get_protocol_stats(); - assert_eq!(stats.active_count, 1); -} - -#[test] -fn test_get_protocol_stats_with_fee() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Set admin directly in instance storage so admin-gated functions work - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - env.mock_all_auths(); - let fee_collector = Address::generate(&env); - client.propose_fee(&fee_collector, &100); // 1% fee - client.commit_fee(); - - let stats = client.get_protocol_stats(); - assert_eq!(stats.fee_bps, 100); - assert_eq!(stats.fee_collector, Some(fee_collector)); -} - -#[test] -fn test_get_protocol_stats_contract_paused() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Set admin directly in instance storage so admin-gated functions work - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::Admin, &admin); - }); - - env.mock_all_auths(); - client.pause_contract(); - - let stats = client.get_protocol_stats(); - assert!(stats.contract_paused); - - client.unpause_contract(); - let stats_after = client.get_protocol_stats(); - assert!(!stats_after.contract_paused); -} - -#[test] -fn test_resubscribe() { - let (env, contract_id, token_addr, user, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - // Initial subscription - client.subscribe( - &user, - &merchant_a, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let sub1 = client.get_subscription(&user).unwrap(); - assert_eq!(sub1.merchant, merchant_a); - assert_eq!(sub1.amount, 1_0000000); - - // Subscribe again with different parameters - client.subscribe( - &user, - &merchant_b, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - let sub2 = client.get_subscription(&user).unwrap(); - - assert_eq!(sub2.merchant, merchant_b); - assert_eq!(sub2.amount, 2_0000000); - assert_eq!(sub2.interval, 172800); - - // Verify old merchant is gone - assert_ne!(sub2.merchant, merchant_a); -} - -#[test] -fn test_subscribe_overwrites_cancelled_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. Cancel - client.cancel(&user); - let sub_cancelled = client.get_subscription(&user).unwrap(); - assert!(!sub_cancelled.active); - - // 3. Subscribe again - client.subscribe( - &user, - &merchant, - &2_0000000, - &172800, - &token_addr, - &None, - &None, - ); - - // 4. Verify new subscription is active - let sub_new = client.get_subscription(&user).unwrap(); - assert!(sub_new.active); - assert_eq!(sub_new.amount, 2_0000000); -} - -// ───────────────────────────────────────────── -// min_interval tests -// ───────────────────────────────────────────── - -/// get_min_interval returns 3600 (1 hour) before any admin configuration. -#[test] -fn test_get_min_interval_default() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - assert_eq!(client.get_min_interval(), 3600); -} - -#[test] -fn test_min_interval_event_emitted_on_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - - // Verify default value is 3600 before setting - assert_eq!(client.get_min_interval(), 3600); - - // First set: old value should be 3600 default, new value 7200 - client.set_min_interval(&7200u64); - assert_eq!(client.get_min_interval(), 7200); - - let events_vec = env.events().all(); - let (_, topics, data) = events_vec.get(events_vec.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "min_interval_set")); - - let event_data: events::MinIntervalSetEventData = data.try_into_val(&env).unwrap(); - assert_eq!(event_data.old, 3600); - assert_eq!(event_data.new, 7200); - - // Second set: old value 7200, new value 86400 - client.set_min_interval(&86400u64); - assert_eq!(client.get_min_interval(), 86400); - - let events_vec2 = env.events().all(); - let (_, topics2, data2) = events_vec2.get(events_vec2.len() - 1).unwrap(); - let topic_symbol2: Symbol = topics2.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol2, Symbol::new(&env, "min_interval_set")); - - let event_data2: events::MinIntervalSetEventData = data2.try_into_val(&env).unwrap(); - assert_eq!(event_data2.old, 7200); - assert_eq!(event_data2.new, 86400); - - // Same value set again: old == 86400, new == 86400 - client.set_min_interval(&86400u64); - let events_vec3 = env.events().all(); - let (_, topics3, data3) = events_vec3.get(events_vec3.len() - 1).unwrap(); - let topic_symbol3: Symbol = topics3.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol3, Symbol::new(&env, "min_interval_set")); - - let event_data3: events::MinIntervalSetEventData = data3.try_into_val(&env).unwrap(); - assert_eq!(event_data3.old, 86400); - assert_eq!(event_data3.new, 86400); -} - -#[test] -fn test_top_merchants_by_subs() { - let (env, contract_id, token_addr, _user, _m) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - - client.add_merchant(&m1); - client.add_merchant(&m2); - client.add_merchant(&m3); - - // Create subscriptions for m1 (1 sub), m2 (3 subs), m3 (2 subs) - let u1 = setup_funded_user(&env, &contract_id, &token_addr); - let u2 = setup_funded_user(&env, &contract_id, &token_addr); - let u3 = setup_funded_user(&env, &contract_id, &token_addr); - let u4 = setup_funded_user(&env, &contract_id, &token_addr); - let u5 = setup_funded_user(&env, &contract_id, &token_addr); - let u6 = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); - - client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u3, &m2, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u4, &m2, &1_0000000, &86400, &token_addr, &None, &None); - - client.subscribe(&u5, &m3, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u6, &m3, &1_0000000, &86400, &token_addr, &None, &None); - - // Top 3 merchants: m2 (3 subs), m3 (2 subs), m1 (1 sub) - let top = client.get_top_merchants_by_subs(&3u32); - assert_eq!(top.len(), 3); - assert_eq!(top.get(0).unwrap(), (m2.clone(), 3u32)); - assert_eq!(top.get(1).unwrap(), (m3.clone(), 2u32)); - assert_eq!(top.get(2).unwrap(), (m1.clone(), 1u32)); - - // Unknown / unindexed merchant returns 0 for subscriber count query - let unindexed = Address::generate(&env); - assert_eq!(client.get_merchant_sub_count(&unindexed), 0); -} - -#[test] -fn test_top_merchants_tie_breaking_and_limit() { - let (env, contract_id, token_addr, _user, _m) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - - // Add m1 first, then m2 - client.add_merchant(&m1); - client.add_merchant(&m2); - - let u1 = setup_funded_user(&env, &contract_id, &token_addr); - let u2 = setup_funded_user(&env, &contract_id, &token_addr); - - // Both m1 and m2 get 1 sub (tie) - client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); - client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); - - // Tie-breaking preserves index order: m1 first, m2 second - let top = client.get_top_merchants_by_subs(&2u32); - assert_eq!(top.len(), 2); - assert_eq!(top.get(0).unwrap(), (m1.clone(), 1u32)); - assert_eq!(top.get(1).unwrap(), (m2.clone(), 1u32)); - - // Limit 1 returns top 1 - let top1 = client.get_top_merchants_by_subs(&1u32); - assert_eq!(top1.len(), 1); - assert_eq!(top1.get(0).unwrap(), (m1.clone(), 1u32)); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_top_merchants_limit_exceeded_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.get_top_merchants_by_subs(&21u32); -} - -/// subscribe panics with IntervalTooShort when interval < default floor of 3600. -#[test] -#[should_panic] -fn test_subscribe_interval_too_short_panics_default_floor() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // 1800 seconds (30 min) < 3600 default floor - client.subscribe( - &user, - &merchant, - &1_0000000, - &1800, - &token_addr, - &None, - &None, - ); -} - -/// Lowering the floor via set_min_interval then subscribing at the new floor succeeds. -#[test] -fn test_subscribe_after_set_min_interval_lower_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - client.set_min_interval(&60u64); - - assert_eq!(client.get_min_interval(), 60); - // 60 seconds == new floor — should succeed - client.subscribe(&user, &merchant, &1_0000000, &60, &token_addr, &None, &None); - assert!(client.get_subscription(&user).unwrap().active); -} - -#[test] -fn prop_subscribe_interval_respects_min_interval_floor() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let default_floor = client.get_min_interval(); - - let mut state = 0x9e3779b97f4a7c15u64; - for sample in 0..4 { - state ^= state << 7; - state ^= state >> 9; - let interval = if sample == 0 { - 0 - } else { - state % default_floor - }; - let user = setup_funded_user(&env, &contract_id, &token_addr); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - })); - assert!(result.is_err(), "interval {interval} must be rejected"); - } - - for offset in 0..4 { - let interval = default_floor + offset; - let user = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscription(&user).unwrap().interval, interval); - } - - let admin = Address::generate(&env); - client.set_initial_admin(&admin); - let updated_floor = 97u64; - client.set_min_interval(&updated_floor); - assert_eq!(client.get_min_interval(), updated_floor); - - for sample in 0..4 { - state ^= state << 7; - state ^= state >> 9; - let interval = if sample == 0 { - 0 - } else { - state % updated_floor - }; - let user = setup_funded_user(&env, &contract_id, &token_addr); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - })); - assert!(result.is_err(), "updated floor rejected interval {interval}"); - } - - for offset in 0..4 { - let interval = updated_floor + offset; - let user = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscription(&user).unwrap().interval, interval); - } -} - -/// set_min_interval(0) panics. -#[test] -#[should_panic(expected = "Error(Contract, #3)")] -fn test_set_min_interval_zero_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - client.set_min_interval(&0u64); -} - -/// Calling set_min_interval without a configured admin panics. -#[test] -#[should_panic(expected = "admin not set")] -fn test_set_min_interval_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // No admin configured — require_admin panics with "admin not set" - client.set_min_interval(&7200u64); -} - -// ───────────────────────────────────────────── -// clear_merchant_revenue_history tests -// ───────────────────────────────────────────── - -/// Admin can clear history; subsequent query returns an empty Vec (zero-length). -/// Clearing does not affect the cumulative revenue total. -#[test] -fn test_clear_merchant_revenue_history_drops_history() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.set_initial_admin(&admin); - - // Produce some history via a charge - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - // History should have one entry - let history_before = client.get_merchant_revenue_history(&merchant, &10u32); - assert_eq!(history_before.len(), 1); - - // Cumulative revenue is present - let revenue = client.get_merchant_revenue(&merchant); - assert!(revenue > 0); - - // Clear history as admin - client.clear_merchant_revenue_history(&merchant); - - // History is now zero-length - let history_after = client.get_merchant_revenue_history(&merchant, &10u32); - assert_eq!(history_after.len(), 0); - - // Cumulative revenue is untouched - assert_eq!(client.get_merchant_revenue(&merchant), revenue); -} - -/// Clearing history for a merchant with no recorded data is idempotent (does not panic). -#[test] -fn test_clear_merchant_revenue_history_idempotent() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - let unknown_merchant = Address::generate(&env); - - client.set_initial_admin(&admin); - - // First call — no data exists, must not panic - client.clear_merchant_revenue_history(&unknown_merchant); - // Second call — still no data, must not panic - client.clear_merchant_revenue_history(&unknown_merchant); - - assert_eq!( - client - .get_merchant_revenue_history(&unknown_merchant, &5u32) - .len(), - 0 - ); -} - -/// Calling clear_merchant_revenue_history without an admin configured panics. -#[test] -#[should_panic(expected = "admin not set")] -fn test_clear_merchant_revenue_history_non_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - // No admin configured — require_admin panics - client.clear_merchant_revenue_history(&merchant); -} - -// ───────────────────────────────────────────── -// Subscriber index tests -// ───────────────────────────────────────────── - -#[test] -fn test_subscriber_index_three_unique_users() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let user_c = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_c, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_count(), 3); - - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 3); - assert_eq!(page.get(0).unwrap(), user_a); - assert_eq!(page.get(1).unwrap(), user_b); - assert_eq!(page.get(2).unwrap(), user_c); -} - -#[test] -fn test_get_subscriber_at_returns_first() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_at(&0u64), Some(user)); - assert_eq!(client.get_subscriber_at(&1u64), None); -} - -#[test] -fn test_resubscribe_active_does_not_duplicate_index() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - // Re-subscribe while still active — must not append a second entry - client.subscribe( - &user, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 1); -} - -#[test] -fn test_subscriber_page_offset_beyond_count_returns_empty() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_count(), 1); - - let page = client.get_subscriber_page(&1u64, &10u32); - assert_eq!(page.len(), 0); - - let page_zero_limit = client.get_subscriber_page(&0u64, &0u32); - assert_eq!(page_zero_limit.len(), 0); -} - -#[test] -#[cfg(feature = "bench")] -fn test_subscriber_page_limit_capped_at_50() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let sac = StellarAssetClient::new(&env, &token_addr); - let token = TokenClient::new(&env, &token_addr); - - for _ in 0..52 { - let sub_user = Address::generate(&env); - sac.mint(&sub_user, &10_000_0000000); - token.approve(&sub_user, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &sub_user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - } - - assert_eq!(client.get_subscriber_count(), 53); - - let page = client.get_subscriber_page(&0u64, &100u32); - assert_eq!(page.len(), 50); -} -// Issue #231: token.rs SAC compatibility test -// ───────────────────────────────────────────── - -/// Test that a custom SAC token (not native XLM) works end-to-end -/// with subscribe, charge, and pay_per_use operations. -#[test] -fn test_custom_sac_token_end_to_end_flow() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Setup a custom SAC token (not the default one from setup()) - let custom_token = setup_second_token(&env, &contract_id, &user); - let token = TokenClient::new(&env, &custom_token); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - // Step 1: Subscribe with custom SAC token - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &custom_token, - &None, - &None, - ); - - // Verify subscription uses the custom token - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active); - assert_eq!(sub.amount, amount); - assert_eq!( - sub.token, custom_token, - "subscription should use custom SAC token" - ); - - // Step 2: Charge after interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let user_balance_before = token.balance(&user); - let merchant_balance_before = token.balance(&merchant); - - client.charge(&user); - - let user_balance_after = token.balance(&user); - let merchant_balance_after = token.balance(&merchant); - - // Verify exact amount transferred - assert_eq!( - user_balance_before - user_balance_after, - amount, - "user balance should decrease by subscription amount" - ); - assert_eq!( - merchant_balance_after - merchant_balance_before, - amount, - "merchant balance should increase by subscription amount" - ); - - // Step 3: Pay-per-use with custom SAC token - let user_balance_before_ppu = token.balance(&user); - let merchant_balance_before_ppu = token.balance(&merchant); - - let ppu_amount: i128 = 2_0000000; - client.pay_per_use(&user, &ppu_amount); - - let user_balance_after_ppu = token.balance(&user); - let merchant_balance_after_ppu = token.balance(&merchant); - - // Verify pay-per-use amount transferred - assert_eq!( - user_balance_before_ppu - user_balance_after_ppu, - ppu_amount, - "user balance should decrease by pay_per_use amount" - ); - assert_eq!( - merchant_balance_after_ppu - merchant_balance_before_ppu, - ppu_amount, - "merchant balance should increase by pay_per_use amount" - ); - - // Verify subscription is still active after pay_per_use - let sub_final = client.get_subscription(&user).unwrap(); - assert!( - sub_final.active, - "subscription should remain active after pay_per_use" - ); -} - -// ───────────────────────────────────────────────────────────── -// Issue #237: get_token() read function tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_get_token_returns_none_when_not_initialized() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let client = FlowPayClient::new(&env, &contract_id); - assert!(client.get_token().is_none()); -} - -#[test] -fn test_get_token_returns_initialized_token() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - client.initialize(&token_addr, &admin); - assert_eq!(client.get_token(), Some(token_addr)); -} - -// ───────────────────────────────────────────── -// Issue: get_grace_period getter -// ───────────────────────────────────────────── - -#[test] -fn test_get_grace_period_default_zero() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - assert_eq!(client.get_grace_period(), 0); -} - -#[test] -fn test_get_grace_period_after_set() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - client.propose_grace_period(&3600); - client.commit_grace_period(); - assert_eq!(client.get_grace_period(), 3600); -} - -// ───────────────────────────────────────────── -// Issue: fee_updated event on set_fee -// ───────────────────────────────────────────── - -#[test] -fn test_set_fee_emits_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - client.commit_fee(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let (emitted_collector, emitted_bps): (Address, u32) = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); - assert_eq!(emitted_collector, collector); - assert_eq!(emitted_bps, 100u32); -} - -#[test] -fn test_get_fee_returns_current_fee_settings() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &250); - client.commit_fee(); - - assert_eq!(client.get_fee(), Some((collector, 250u32))); -} - -#[test] -#[should_panic] -fn test_set_fee_invalid_bps_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &10001); - client.commit_fee(); -} - -// ───────────────────────────────────────────── -// Issue: grace_period_updated event on set_grace_period -// ───────────────────────────────────────────── - -#[test] -fn test_set_grace_period_emits_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_grace_period(&7200); - client.commit_grace_period(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let emitted_seconds: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!(topic_symbol, Symbol::new(&env, "grace_period_committed")); - assert_eq!(emitted_seconds, 7200u64); -} - -// ───────────────────────────────────────────── -// Issue #195: grace period charge behavior -// ───────────────────────────────────────────── - -#[test] -fn test_charge_within_grace_window_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Past billing interval but still inside grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period / 2; - }); - - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.last_charged, env.ledger().timestamp()); -} - -#[test] -#[should_panic(expected = "Error(Contract, #9)")] -fn test_charge_after_grace_window_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_non_admin_set_grace_period_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.propose_grace_period(&3600); - client.commit_grace_period(); -} - -// ───────────────────────────────────────────── - -// ------------------------------------------------------------- -// Issue #45: resume/cancel on grace-lapsed subscriptions -// ------------------------------------------------------------- - - -/// resume on a grace-lapsed subscription must panic with ResumeGraceLapsed (#100). -#[test] -#[should_panic(expected = "Error(Contract, #43)")] -fn test_resume_after_grace_lapse_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval + grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - // resume must be rejected because the grace window has closed - client.resume(&user); -} - -/// cancel on a grace-lapsed subscription must still succeed. -#[test] -fn test_cancel_after_grace_lapse_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval + grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period + 1; - }); - - // cancel must still be allowed so the user can exit cleanly - client.cancel(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.active, "subscription should be inactive after cancel"); -} - -/// resume within a valid (non-lapsed) grace window must succeed normally. -#[test] -fn test_resume_within_grace_window_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let grace_period: u64 = 86400; - let interval: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance past interval but still inside the grace window - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period / 2; - }); - - // resume must succeed because the grace window has not yet closed - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.paused, "subscription should not be paused after resume"); - assert!(sub.active, "subscription should remain active"); -} - -/// resume when no grace period is configured must succeed regardless of elapsed time. -#[test] -fn test_resume_no_grace_period_always_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No grace period set -- default is 0 - let interval: u64 = 86400; - client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.pause(&user); - - // Advance far past the interval -- grace is 0 so lapse check is skipped - env.ledger().with_mut(|l| { - l.timestamp += interval * 10; - }); - - // resume must succeed because grace_period == 0 means no lapse - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(!sub.paused, "subscription should not be paused after resume"); -} - -// Issue #243: Token address validation -// ───────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #12)")] -fn test_subscribe_non_contract_address() { - let (env, contract_id, _token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // Provide a non-contract address (just an account) - use soroban_sdk::xdr::{AccountId, PublicKey, ScAddress, Uint256}; - use soroban_sdk::TryFromVal; - let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0; 32]))); - let non_contract_token = Address::try_from_val(&env, &ScAddress::Account(account_id)).unwrap(); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &non_contract_token, - &None, - &None, - ); -} - -#[test] -fn test_subscribe_valid_sac_token_address_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.token, token_addr); -} - -// Issue #232: charge() insufficient-allowance error path -// ───────────────────────────────────────────── - -/// If a user's token allowance drops below `sub.amount` between subscribe and -/// charge time, `transfer_from` must fail and propagate the error. -#[test] -#[should_panic] -fn test_charge_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - // Subscribe with sufficient allowance - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Revoke allowance — set it to 0 - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &200); - - // Advance ledger past the interval - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - // charge() should panic because transfer_from fails with insufficient allowance - client.charge(&user); -} - -#[test] -fn test_set_metadata_label_at_limit_succeeds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let valid_label = soroban_sdk::String::from_str( - &env, - "this_is_a_perfectly_valid_sixty_four_character_metadata_label_ok", - ); - assert_eq!(valid_label.len(), 64); - - client.set_metadata(&user, &valid_label); - - assert_eq!(client.get_metadata(&user), Some(valid_label)); -} - -#[test] -#[should_panic] -fn test_set_metadata_label_exceeding_limit_fails() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let invalid_label = soroban_sdk::String::from_str( - &env, - "this_is_an_invalid_sixty_five_character_metadata_label_too_long_!", - ); - assert_eq!(invalid_label.len(), 65); - - client.set_metadata(&user, &invalid_label); -} -// ───────────────────────────────────────────── -// Issue #469: set_subscription_label auth and alias tests -// ───────────────────────────────────────────── -#[test] -fn test_set_metadata_wrong_user_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let attacker = Address::generate(&env); - let label = soroban_sdk::String::from_str(&env, "hacked"); - client.set_metadata(&attacker, &label); -} - -#[test] -fn test_get_subscription_label_returns_set_value() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - let label = soroban_sdk::String::from_str(&env, "premium"); - client.set_metadata(&user, &label); - assert_eq!(client.get_subscription_label(&user), Some(label)); -} - -#[test] -fn test_get_subscription_label_none_when_not_set() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let random = Address::generate(&env); - assert!(client.get_subscription_label(&random).is_none()); -} - -// ───────────────────────────────────────────── -// Tests for pause() and resume() -// ───────────────────────────────────────────── - -#[test] -fn test_pause_sets_paused_true() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.paused); -} - -#[test] -#[should_panic] -fn test_charge_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); -} - -#[test] -#[should_panic] -fn test_pay_per_use_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - client.pay_per_use(&user, &1_0000000); -} - -#[test] -fn test_resume_unpauses_and_charge_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - client.resume(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.last_charged > 0); -} - -#[test] -#[should_panic] -fn test_pause_on_inactive_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - client.pause(&user); -} - -// ───────────────────────────────────────────── -// Tests for next_charge_at() -// ───────────────────────────────────────────── - -#[test] -fn test_next_charge_at_returns_correct_timestamp() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - let sub = client.get_subscription(&user).unwrap(); - let expected = sub.last_charged + sub.interval; - let got = client.next_charge_at(&user).unwrap(); - assert_eq!(got, expected); -} - -#[test] -fn test_next_charge_at_none_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - assert!(client.next_charge_at(&user).is_none()); -} - -#[test] -fn test_next_charge_at_none_for_unknown_address() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!(client.next_charge_at(&random).is_none()); -} - -#[test] -fn test_transfer_subscription_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.transfer_subscription(&user, &new_user); - - assert!( - client.get_subscription(&user).is_none(), - "old subscription should be removed" - ); - - let new_sub = client.get_subscription(&new_user).unwrap(); - assert!(new_sub.active, "new subscription should be active"); - assert_eq!(new_sub.merchant, merchant); - assert_eq!(new_sub.amount, 1_0000000); - assert_eq!(client.get_subscriber_count(), 2); - assert_eq!(client.get_subscriber_at(&0u64), None); - assert_eq!(client.get_subscriber_at(&1u64), Some(new_user)); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); -} - -#[test] -fn test_transfer_subscription_to_inactive_user_reuses_tombstone_membership() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let new_user = setup_funded_user(&env, &contract_id, &token_addr); - let inactive_merchant = Address::generate(&env); - - client.subscribe( - &new_user, - &inactive_merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&new_user); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &new_user); - - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - assert_eq!(client.get_merchant_sub_count(&inactive_merchant), 0); - assert_eq!(client.get_subscriber_count(), 3); - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 1); - assert_eq!(page.get(0).unwrap(), new_user); -} - -#[test] -fn test_transfer_subscription_event_emitted() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.transfer_subscription(&user, &new_user); - - let mut seen_transfer_event = false; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - if topic_symbol == Symbol::new(&env, "subscription_transferred") { - let topic_from: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let topic_to: Address = topics.get(2).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_from, user); - assert_eq!(topic_to, new_user); - - let event_payload: (Address, i128, u64, Address) = data.try_into_val(&env).unwrap(); - assert_eq!(event_payload.0, merchant); - assert_eq!(event_payload.1, 1_0000000); - assert_eq!(event_payload.2, 86400); - assert_eq!(event_payload.3, token_addr); - seen_transfer_event = true; - } - } - - assert!( - seen_transfer_event, - "expected a subscription_transferred event" - ); -} - -#[test] -#[should_panic] -fn test_transfer_subscription_to_active_user_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let new_user = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&new_user, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&new_user, &contract_id, &10_000_0000000, &200); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &new_user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &new_user); -} -// ───────────────────────────────────────────── -// CONTRACT-08: Allowance pre-validation tests -// ───────────────────────────────────────────── - -/// subscribe() with zero allowance must panic with InsufficientAllowance -/// and must NOT write the subscription to storage. -#[test] -#[should_panic(expected = "Error(Contract, #8)")] -fn test_subscribe_zero_allowance_panics() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - env.storage().instance().set(&DataKey::SchemaVersion, &3u32); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // Deliberately grant zero allowance — no approve() call. - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -/// After a zero-allowance subscribe() panic, get_subscription() must return None, -/// confirming no storage was written. -/// Note: In the Soroban test environment, panics abort the entire transaction, -/// so storage changes from the failed call are never committed. We verify this -/// by reading storage directly inside the contract after a successful (non-panicking) -/// path: a user who was never subscribed must always return None. -#[test] -fn test_subscribe_zero_allowance_does_not_write_storage() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - let user = Address::generate(&env); - - // Never approved any allowance — a subscribe call would panic. - // Soroban transactions are atomic: a panic reverts all storage writes. - // We confirm the storage slot starts empty (None) and — since we cannot - // call subscribe without panicking — we verify the invariant holds: a - // user address that has never successfully subscribed always returns None. - let client = FlowPayClient::new(&env, &contract_id); - assert!( - client.get_subscription(&user).is_none(), - "subscription must not be stored for a user who has never successfully subscribed" - ); -} - -/// subscribe() with allowance exactly equal to amount must succeed. -#[test] -fn test_subscribe_exact_allowance_succeeds() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::SchemaVersion, &3u32); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let amount: i128 = 5_0000000; - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // Approve exactly amount — no more, no less. - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &amount, &200); - - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - - let sub = client.get_subscription(&user).unwrap(); - assert!(sub.active, "subscription should be active"); - assert_eq!(sub.amount, amount); -} - -/// Re-subscribe (overwriting a cancelled subscription) with zero allowance -/// must also panic with InsufficientAllowance. -#[test] -#[should_panic(expected = "Error(Contract, #8)")] -fn test_resubscribe_zero_allowance_panics() { - let env = Env::default(); - env.mock_all_auths(); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_addr = token_id.address(); - - let contract_id = env.register_contract(None, FlowPay); - env.as_contract(&contract_id, || { - env.storage().instance().set(&DataKey::SchemaVersion, &3u32); - }); - - let user = Address::generate(&env); - let merchant = Address::generate(&env); - - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user, &10_000_0000000); - - let amount: i128 = 1_0000000; - - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, false); - }); - - // First subscribe with sufficient allowance. - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &10_000_0000000, &200); - - let client = FlowPayClient::new(&env, &contract_id); - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - client.cancel(&user); - - // Revoke allowance so second subscribe sees zero. - token.approve(&user, &contract_id, &0, &200); - - // Re-subscribe must panic because allowance is zero. - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); -} - -// ───────────────────────────────────────────── -// CONTRACT-36: set_subscription_amount tests -// ───────────────────────────────────────────── - -/// Admin successfully updates a subscription amount; get_subscription reflects -/// the new value and last_charged / interval are untouched. -#[test] -fn test_set_subscription_amount_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let original_amount: i128 = 1_0000000; - let new_amount: i128 = 3_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &original_amount, - &interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - assert_eq!(sub_before.amount, original_amount); - let last_charged_before = sub_before.last_charged; - - client.set_subscription_amount(&user, &new_amount); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!(sub_after.amount, new_amount, "amount should be updated"); - assert_eq!( - sub_after.last_charged, last_charged_before, - "last_charged must not change" - ); - assert_eq!(sub_after.interval, interval, "interval must not change"); - assert!(sub_after.active, "subscription should remain active"); -} - -/// Updating a non-existent subscription must panic with NoSubscriptionFound. -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_set_subscription_amount_no_subscription_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.set_subscription_amount(&random, &2_0000000); -} - -/// A non-admin caller must not be able to update a subscription amount. -#[test] -#[should_panic] -fn test_set_subscription_amount_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Remove all authorizations so the admin auth check fails. - env.set_auths(&[]); - - client.set_subscription_amount(&user, &2_0000000); -} - -// ───────────────────────────────────────────── -// CONTRACT-37: set_subscription_interval tests -// ───────────────────────────────────────────── - -/// Admin successfully updates the billing interval; next_charge_at reflects the -/// new value and last_charged / amount are untouched. -#[test] -fn test_set_subscription_interval_admin_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let amount: i128 = 1_0000000; - let original_interval: u64 = 86400; // 1 day - let new_interval: u64 = 30 * 24 * 3600; // 30 days - - client.subscribe( - &user, - &merchant, - &amount, - &original_interval, - &token_addr, - &None, - &None, - ); - - let sub_before = client.get_subscription(&user).unwrap(); - assert_eq!(sub_before.interval, original_interval); - let last_charged_before = sub_before.last_charged; - let amount_before = sub_before.amount; - - client.set_subscription_interval(&user, &new_interval); - - let sub_after = client.get_subscription(&user).unwrap(); - assert_eq!( - sub_after.interval, new_interval, - "interval should be updated" - ); - assert_eq!( - sub_after.last_charged, last_charged_before, - "last_charged must not change" - ); - assert_eq!(sub_after.amount, amount_before, "amount must not change"); - assert!(sub_after.active, "subscription should remain active"); - - // next_charge_at must reflect last_charged + new_interval - let expected_next = last_charged_before + new_interval; - assert_eq!( - client.next_charge_at(&user).unwrap(), - expected_next, - "next_charge_at should use the updated interval" - ); -} - -/// Setting an interval of zero must panic with IntervalMustBePositive. -#[test] -#[should_panic(expected = "Error(Contract, #3)")] -fn test_set_subscription_interval_zero_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_interval(&user, &0); -} - -/// Updating the interval for a non-existent subscription must panic with -/// NoSubscriptionFound. -#[test] -#[should_panic(expected = "Error(Contract, #4)")] -fn test_set_subscription_interval_no_subscription_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let random = Address::generate(&env); - client.set_subscription_interval(&random, &86400); -} - -/// A non-admin caller must not be able to update the billing interval. -#[test] -#[should_panic] -fn test_set_subscription_interval_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - env.set_auths(&[]); - - client.set_subscription_interval(&user, &172800); -} - -// ───────────────────────────────────────────── -// CONTRACT-38: withdraw_merchant_revenue tests -// ───────────────────────────────────────────── - -/// Merchant with accrued revenue can withdraw the full tracked balance. -/// After withdrawal: token balance increases by the tracked amount and the -/// revenue counter resets to zero. -#[test] -fn test_withdraw_merchant_revenue_succeeds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let sac = StellarAssetClient::new(&env, &token_addr); - - // Initialize the global token so withdraw can resolve it. - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.initialize(&token_addr, &admin); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - client.charge(&user); - - // The tracked revenue equals the net charge (no fee configured in setup). - let tracked = client.get_merchant_revenue(&merchant); - assert!(tracked > 0, "revenue should be positive after charge"); - - // Seed the contract with enough tokens to cover the withdrawal. - // In a pooling model the contract would accumulate these from charges - // routed through it; here we simulate that by minting directly. - sac.mint(&contract_id, &tracked); - - let merchant_balance_before = token.balance(&merchant); - - client.withdraw_merchant_revenue(&merchant); - - // Revenue counter must be reset to zero. - assert_eq!( - client.get_merchant_revenue(&merchant), - 0, - "revenue counter must be reset after withdrawal" - ); - - // Merchant token balance must increase by the tracked amount. - let merchant_balance_after = token.balance(&merchant); - assert_eq!( - merchant_balance_after - merchant_balance_before, - tracked, - "merchant token balance should increase by the withdrawn amount" - ); -} - -/// Withdrawal with no accrued balance must panic with ZeroBalanceAvailable. -#[test] -#[should_panic(expected = "Error(Contract, #21)")] -fn test_withdraw_merchant_revenue_zero_balance_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.initialize(&token_addr, &admin); - - // No charges have occurred, so revenue is zero. - client.withdraw_merchant_revenue(&merchant); -} - -#[test] -fn test_next_charge_at_none_for_paused_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - assert!(client.next_charge_at(&user).is_none()); -} - -#[test] -fn test_is_charge_due_transitions_after_interval() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Before interval elapses: not due - assert!(!client.is_charge_due(&user)); - - env.ledger().with_mut(|l| { - l.timestamp += interval; - }); - assert!(client.is_charge_due(&user)); -} - -#[test] -fn test_is_charge_due_false_for_paused_subscription() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - assert!(!client.is_charge_due(&user)); -} - -// ───────────────────────────────────────────── -// ───────────────────────────────────────────── -// CONTRACT-53: batch_pause_subscriptions tests -// ───────────────────────────────────────────── - -/// Admin can pause multiple valid subscriptions in a single batch call. -/// The test verifies paused flag is set, events are emitted, and already-paused -/// or missing addresses are handled without disruption. -#[test] -fn test_batch_pause_subscriptions_mixed_inputs() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Set up user_b with a subscription - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - // Set up user_c with a subscription (will be paused first) - let user_c = Address::generate(&env); - sac.mint(&user_c, &10_000_0000000); - token.approve(&user_c, &contract_id, &10_000_0000000, &200); - - // Set up user_d with a subscription (valid, will be paused in batch) - let user_d = Address::generate(&env); - sac.mint(&user_d, &10_000_0000000); - token.approve(&user_d, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_c, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_d, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - - // Pre-pause user_c - client.pause(&user_c); - let sub_c_before = client.get_subscription(&user_c).unwrap(); - assert!(sub_c_before.paused); - - // Verify all others start unpaused - assert!(!client.get_subscription(&user_a).unwrap().paused); - assert!(!client.get_subscription(&user_b).unwrap().paused); - assert!(!client.get_subscription(&user_d).unwrap().paused); - - // Build batch with mixed inputs: valid, missing, already-paused, valid - let no_sub_user = Address::generate(&env); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); // valid → should be paused - users.push_back(no_sub_user.clone()); // no subscription → skipped - users.push_back(user_c.clone()); // already paused → no-op - users.push_back(user_b.clone()); // valid → should be paused - users.push_back(user_d.clone()); // valid → should be paused - - let events_before = env.events().all().len(); - - client.batch_pause_subscriptions(&users); - - // All valid subscriptions must be paused - let sub_a = client.get_subscription(&user_a).unwrap(); - assert!(sub_a.paused, "user_a should be paused"); - - let sub_b = client.get_subscription(&user_b).unwrap(); - assert!(sub_b.paused, "user_b should be paused"); - - let sub_d = client.get_subscription(&user_d).unwrap(); - assert!(sub_d.paused, "user_d should be paused"); - - // Already-paused user_c remains paused - let sub_c = client.get_subscription(&user_c).unwrap(); - assert!(sub_c.paused, "user_c should remain paused"); - - // No subscription was created for no_sub_user - assert!( - client.get_subscription(&no_sub_user).is_none(), - "no_sub_user should have no subscription" - ); - - // Verify events: three subscription_paused events (user_a, user_b, user_d) - let events_after = env.events().all(); - let paused_event_count = (events_before..events_after.len()) - .filter(|&i| { - let (_, topics, _) = events_after.get(i).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - topic_symbol == Symbol::new(&env, "subscription_paused") - }) - .count(); - assert_eq!( - paused_event_count, 3, - "should emit 3 subscription_paused events" - ); -} - -/// Non-admin callers must be rejected with an auth panic. -#[test] -#[should_panic] -fn test_batch_pause_subscriptions_non_admin_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Clear all auths — admin auth should fail and panic - env.set_auths(&[]); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - client.batch_pause_subscriptions(&users); -} - -/// Batch size exceeding 25 must panic with BatchTooLarge. -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_pause_subscriptions_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - // Build a vector with 26 entries - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - client.batch_pause_subscriptions(&users); -} - -#[test] -fn test_admin_batch_cancel_subscriptions_cancels_multiple_accounts() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &2_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_cancel(&users); - - assert_eq!(results.len(), 2); - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); - assert!(!client.get_subscription(&user_a).unwrap().active); - assert!(!client.get_subscription(&user_b).unwrap().active); - assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); -} - -#[test] -fn test_batch_cancel_matches_single_cancel_side_effects() { - let (env, contract_id, token_addr, user_single, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_batch = setup_funded_user(&env, &contract_id, &token_addr); - let referrer = Address::generate(&env); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user_single, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - client.subscribe( - &user_batch, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer), - ); - - client.cancel(&user_single); - let mut users = Vec::new(&env); - users.push_back(user_batch.clone()); - let results = client.batch_cancel(&users); - - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!( - client.get_subscription(&user_single), - client.get_subscription(&user_batch) - ); - assert_eq!(client.get_referrer(&user_single), None); - assert_eq!(client.get_referrer(&user_batch), None); - assert_eq!(client.get_active_count(), 0); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - assert_eq!(client.get_subscriber_count(), 2); - assert!(client.get_subscriber_at(&0).is_none()); - assert!(client.get_subscriber_at(&1).is_none()); - assert_eq!(count_user_events(&env, "cancelled", &user_single), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_batch), 1); -} - -#[test] -#[should_panic] -fn test_batch_cancel_requires_admin_auth() { - let env = Env::default(); - let contract_id = env.register_contract(None, FlowPay); - let admin = Address::generate(&env); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = Vec::new(&env); - users.push_back(user); - - client.batch_cancel(&users); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_cancel_exceeds_max_size_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..26 { - users.push_back(Address::generate(&env)); - } - client.batch_cancel(&users); -} - -#[test] -fn test_batch_cancel_at_max_size_succeeds() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..25 { - users.push_back(Address::generate(&env)); - } - - let results = client.batch_cancel(&users); - assert_eq!(results.len(), 25); - for result in results.iter() { - assert_eq!(result, CancelResult::NoSubscription); - } -} - -#[test] -fn test_batch_cancel_handles_mixed_states_and_clears_referral() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - let user_c = setup_funded_user(&env, &contract_id, &token_addr); - let missing_user = Address::generate(&env); - let referrer = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user_a); - }); - - client.subscribe( - &user_a, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user_b); - client.subscribe( - &user_c, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user_c); - - assert_eq!(client.get_referrer(&user_a), Some(referrer)); - - let mut users = Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - users.push_back(user_c.clone()); - users.push_back(missing_user.clone()); - - let results = client.batch_cancel(&users); - - assert_eq!(results.len(), 4); - assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); - assert_eq!(results.get(2).unwrap(), CancelResult::AlreadyCancelled); - assert_eq!(results.get(3).unwrap(), CancelResult::NoSubscription); - - assert!(!client.get_subscription(&user_a).unwrap().active); - assert!(!client.get_subscription(&user_b).unwrap().active); - assert!(!client.get_subscription(&user_c).unwrap().active); - assert!(client.get_subscription(&missing_user).is_none()); - - assert_eq!(client.get_referrer(&user_a), None); - assert_eq!(client.get_active_count(), 0); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - assert_eq!(client.get_subscriber_count(), 3); - assert!(client.get_subscriber_at(&0).is_none()); - assert!(client.get_subscriber_at(&1).is_none()); - assert!(client.get_subscriber_at(&2).is_none()); - - assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); - assert_eq!(count_user_events(&env, "cancelled", &user_c), 1); -} - -// ───────────────────────────────────────────── -// CONTRACT-07: get_merchant_sub_count tests -// ───────────────────────────────────────────── - -#[test] -fn test_merchant_sub_count_two_users_cancel_one() { - let (env, contract_id, token_addr, user_a, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_b = Address::generate(&env); - let sac = StellarAssetClient::new(&env, &token_addr); - sac.mint(&user_b, &10_000_0000000); - let token = TokenClient::new(&env, &token_addr); - token.approve(&user_b, &contract_id, &10_000_0000000, &200); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user_a, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - - client.subscribe( - &user_b, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 2); - - client.cancel(&user_a); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); -} - -#[test] -fn test_merchant_sub_count_resubscribe_different_merchant() { - let (env, contract_id, token_addr, user, merchant_a) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchant_b = Address::generate(&env); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - // Subscribe user to merchant A - client.subscribe( - &user, - &merchant_a, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant_a), 1); - assert_eq!(client.get_merchant_sub_count(&merchant_b), 0); - - // Re-subscribe user to merchant B - client.subscribe( - &user, - &merchant_b, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant_a), 0); - assert_eq!(client.get_merchant_sub_count(&merchant_b), 1); -} - -#[test] -fn test_merchant_sub_count_never_subscribed_returns_zero() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let unknown_merchant = Address::generate(&env); - assert_eq!(client.get_merchant_sub_count(&unknown_merchant), 0); -} - -#[test] -fn test_merchant_sub_count_double_cancel_no_underflow() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 1_0000000; - let interval: u64 = 86400; - - client.subscribe( - &user, - &merchant, - &amount, - &interval, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_merchant_sub_count(&merchant), 1); - - client.cancel(&user); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); - - // Second cancel must not underflow - client.cancel(&user); - assert_eq!(client.get_merchant_sub_count(&merchant), 0); -} - -#[test] -fn test_is_charge_due_false_past_grace_window() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let interval: u64 = 86400; - let grace: u64 = 3600; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - client.propose_grace_period(&grace); - client.commit_grace_period(); - - env.ledger().with_mut(|l| { - l.timestamp += interval + grace + 1; - }); - - assert!(!client.is_charge_due(&user)); -} - -#[test] -fn test_is_charge_due_false_for_unknown_address() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert!(!client.is_charge_due(&Address::generate(&env))); -} - -#[test] -fn test_daily_limit_day_start_boundary() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &100_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - // Spend 10 - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 10_0000000); - - // Spend 10 more - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 20_0000000); - - // Manually extend DailyLimit (and other entries touched by the upcoming pay_per_use) - // TTL so they survive the time skip below. - env.as_contract(&contract_id, || { - let key = DataKey::DailyLimit(user.clone()); - // 35,000 ledgers > LEDGERS_PER_DAY (17,280) - env.storage().temporary().extend_ttl(&key, 35000, 35000); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenue(merchant.clone()), - 35000, - 35000, - ); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenueHistory(merchant.clone()), - 35000, - 35000, - ); - }); - - // Advance sequence by LEDGERS_PER_DAY + 1 to expire DayStart (17,280 + 1 = 17,281) - env.ledger().with_mut(|l| { - l.sequence_number += 17281; - l.timestamp += 17281 * 5; - }); - - // Renew the token allowance, which expired when the ledger sequence jumped past it - let token = TokenClient::new(&env, &token_addr); - token.approve( - &user, - &contract_id, - &10_000_0000000, - &(env.ledger().sequence() + 200), - ); - - // New spend on new day - client.pay_per_use(&user, &15_0000000); - - // Should only be 15, not 35 - assert_eq!(client.get_daily_spent(&user), 15_0000000); -} - -// ───────────────────────────────────────────── -// CONTRACT-821: simulate_pay_per_use dry-run helper -// ───────────────────────────────────────────── - -/// The sibling dry-run of `pay_per_use` returns distinct outcomes for the -/// inactive, paused, would-succeed, and daily-limit cases, while performing no -/// state writes. -#[test] -fn test_simulate_pay_per_use_variants() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Inactive when no subscription - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::Inactive - ); - - // Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. WouldSucceed when active, no daily limit, allowance sufficient - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::WouldSucceed - ); - - // 3. DailyLimitExceeded when the limit would be exceeded - client.set_daily_limit(&user, &5_0000000); - assert_eq!( - client.simulate_pay_per_use(&user, &6_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // 4. DailyLimitExceeded on cumulative spend: 3, then simulate another 3 (>5) - client.pay_per_use(&user, &3_0000000); - assert_eq!( - client.simulate_pay_per_use(&user, &3_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // 5. SubscriptionPaused when paused - let before_spent = client.get_daily_spent(&user); - client.pause(&user); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::SubscriptionPaused - ); - client.resume(&user); - - // 6. InsufficientAllowance when allowance revoked - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &100); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::InsufficientAllowance - ); - - // 7. ContractPaused - env.as_contract(&contract_id, || { - storage::set_contract_paused(&env, true); - }); - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::ContractPaused - ); - - // No simulation wrote to daily spend tracking. - assert_eq!(client.get_daily_spent(&user), before_spent); -} - -/// `simulate_pay_per_use` performs no state writes: daily spent, day start, and -/// balance are unchanged regardless of the simulated outcome. -#[test] -fn test_simulate_pay_per_use_no_state_writes() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &5_0000000); - - client.pay_per_use(&user, &2_0000000); - - let spent_before = client.get_daily_spent(&user); - let day_start_before = client.get_day_start(&user); - let balance_before = TokenClient::new(&env, &token_addr) - .balance(&user); - - // Would succeed - assert_eq!( - client.simulate_pay_per_use(&user, &1_0000000), - PayPerUseSimResult::WouldSucceed - ); - // Limit exceeded - assert_eq!( - client.simulate_pay_per_use(&user, &5_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - assert_eq!(client.get_daily_spent(&user), spent_before); - assert_eq!(client.get_day_start(&user), day_start_before); - assert_eq!( - TokenClient::new(&env, &token_addr).balance(&user), - balance_before - ); -} - -/// Simulating a spend at a day-window boundary reflects the fresh (reset) daily -/// spent value after the window has elapsed, mirroring `pay_per_use`. -#[test] -fn test_simulate_pay_per_use_day_window_reset_boundary() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &100_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - // Spend 10 today. - client.pay_per_use(&user, &10_0000000); - assert_eq!(client.get_daily_spent(&user), 10_0000000); - - // Crossing the day boundary makes the reset daily spent visible to the - // dry-run: today a 45 spend would exceed (10 + 45 > 50)... - assert_eq!( - client.simulate_pay_per_use(&user, &45_0000000), - PayPerUseSimResult::DailyLimitExceeded - ); - - // Manually extend the DailyLimit (and merchant-revenue) TTL so they survive - // the time skip below, while intentionally leaving DailySpent/DayStart to - // expire so the new window starts from a reset counter. - env.as_contract(&contract_id, || { - let key = DataKey::DailyLimit(user.clone()); - env.storage().temporary().extend_ttl(&key, 35000, 35000); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenue(merchant.clone()), - 35000, - 35000, - ); - env.storage().persistent().extend_ttl( - &DataKey::MerchantRevenueHistory(merchant.clone()), - 35000, - 35000, - ); - }); - - // Advance past the day window (LEDGERS_PER_DAY + 1). - env.ledger().with_mut(|l| { - l.sequence_number += 17281; - l.timestamp += 17281 * 5; - }); - - // Renew the token allowance that expired with the ledger jump. - let token = TokenClient::new(&env, &token_addr); - token.approve( - &user, - &contract_id, - &10_000_0000000, - &(env.ledger().sequence() + 200), - ); - - // The new day's simulated spend is evaluated against a reset counter, - // so the same 45 amount now succeeds. - assert_eq!( - client.simulate_pay_per_use(&user, &45_0000000), - PayPerUseSimResult::WouldSucceed - ); -} - -/// `simulate_pay_per_use_to` accounts for recipient validation (invalid -/// contract self-reference and merchant whitelist) in addition to the shared -/// pay-per-use checks. -#[test] -fn test_simulate_pay_per_use_to_recipient_validation() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Contract's own address is an invalid recipient. - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &contract_id), - PayPerUseSimResult::InvalidRecipient - ); - - // With whitelist enabled, a non-whitelisted recipient is rejected. - env.as_contract(&contract_id, || { - whitelist::set_whitelist_enabled(&env, true); - }); - let random = Address::generate(&env); - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &random), - PayPerUseSimResult::MerchantNotWhitelisted - ); - - // A valid, whitelisted recipient would succeed. - env.as_contract(&contract_id, || { - whitelist::add_merchant(&env, &merchant); - }); - assert_eq!( - client.simulate_pay_per_use_to(&user, &1_0000000, &merchant), - PayPerUseSimResult::WouldSucceed - ); -} - -/// `simulate_pay_per_use` rejects non-positive and over-cap amounts with the -/// same outcomes the real call enforces. -#[test] -fn test_simulate_pay_per_use_amount_bounds() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No subscription yet, but amount bounds are checked before subscription. - assert_eq!( - client.simulate_pay_per_use(&user, &0), - PayPerUseSimResult::AmountMustBePositive - ); - assert_eq!( - client.simulate_pay_per_use(&user, &(MAX_AMOUNT + 1)), - PayPerUseSimResult::AmountExceedsMaximum - ); -} - -// ───────────────────────────────────────────── -// New Feature Unit Tests (Issues #628, #638, #640, #641) -// ───────────────────────────────────────────── - -#[test] -fn test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown() { - let (env, contract_id, token_addr, user1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let user2 = Address::generate(&env); - let user3_unknown = Address::generate(&env); - - let token = TokenClient::new(&env, &token_addr); - token.approve(&user2, &contract_id, &1_000_000_000, &100); - - client.subscribe( - &user1, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user2, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user1.clone()); - users.push_back(user2.clone()); - users.push_back(user3_unknown.clone()); - - let extended = client.batch_extend_subscription_ttl(&users); - assert_eq!(extended.len(), 2); - assert_eq!(extended.get(0).unwrap(), user1); - assert_eq!(extended.get(1).unwrap(), user2); -} - -#[test] -#[should_panic] -fn test_batch_extend_subscription_ttl_over_limit_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - users.push_back(Address::generate(&env)); - } - - client.batch_extend_subscription_ttl(&users); -} - -#[test] -fn test_simulate_charge_variants() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // 1. Inactive when no subscription - assert_eq!(client.simulate_charge(&user), ChargeSimResult::Inactive); - - // Subscribe - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // 2. NotDue immediately after subscribe - assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); - - // Advance time past interval - env.ledger().with_mut(|l| { - l.timestamp += 86401; - }); - - // 3. WouldSucceed when due and allowed - assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); - - // 4. InsufficientAllowance when allowance revoked - let token = TokenClient::new(&env, &token_addr); - token.approve(&user, &contract_id, &0, &100); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::InsufficientAllowance - ); - - // Restore allowance - token.approve(&user, &contract_id, &1_000_000_000, &100); - - // 5. SubscriptionPaused when paused - client.pause(&user); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::SubscriptionPaused - ); - - // Resume - client.resume(&user); - - // 6. GracePeriodElapsed - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::GracePeriod, &3600u64); - }); - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 3601; - }); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::GracePeriodElapsed - ); - - // 7. ContractPaused - env.as_contract(&contract_id, || { - storage::set_contract_paused(&env, true); - }); - assert_eq!( - client.simulate_charge(&user), - ChargeSimResult::ContractPaused - ); -} - -#[test] -fn test_get_schema_version_returns_zero_and_updates() { - let env = Env::default(); - env.mock_all_auths(); - let contract_id = env.register_contract(None, FlowPay); - let user = Address::generate(&env); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_schema_version(), 0); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let empty_users = soroban_sdk::Vec::new(&env); - client.migrate(&empty_users); - assert_eq!(client.get_schema_version(), 3); -} - -#[test] -#[should_panic] -fn test_pay_per_use_to_contract_address_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.pay_per_use_to(&user, &1_0000000, &contract_id); -} - -#[test] -fn test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let recipient = Address::generate(&env); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let amount: i128 = 4_0000000; - let recipient_before = token.balance(&recipient); - - client.pay_per_use_to(&user, &amount, &recipient); - - assert_eq!(token.balance(&recipient) - recipient_before, amount); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #634: get_merchant_revenue_summary -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_merchant_revenue_summary_empty() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let summary = client.get_merchant_revenue_summary(&merchant); - assert_eq!(summary, (0, 0, 0, 0)); -} - -#[test] -fn test_merchant_revenue_summary_single_and_multiple_charges() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let amount: i128 = 10_0000000; - client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); - client.pay_per_use(&user, &amount); - - // First charge recorded: 10_0000000 - let summary1 = client.get_merchant_revenue_summary(&merchant); - assert_eq!(summary1, (amount, 1, amount, amount)); - - // Additional pay_per_use calls with different amounts - client.pay_per_use(&user, &5_0000000); - client.pay_per_use(&user, &25_0000000); - - let summary2 = client.get_merchant_revenue_summary(&merchant); - // total = 10 + 5 + 25 = 40_0000000 - // count = 3 - // min = 5_0000000 - // max = 25_0000000 - assert_eq!(summary2, (40_0000000, 3, 5_0000000, 25_0000000)); -} - -#[test] -fn test_merchant_revenue_summary_cleared_history() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pay_per_use(&user, &10_0000000); - client.clear_merchant_revenue_history(&merchant); - - let summary = client.get_merchant_revenue_summary(&merchant); - // History cleared -> total remains 10_0000000, count/min/max return 0 - assert_eq!(summary, (10_0000000, 0, 0, 0)); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #635: get_subscription_health -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_subscription_health_non_existent_user() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let unknown = Address::generate(&env); - - let health = client.get_subscription_health(&unknown); - assert_eq!( - health, - SubscriptionHealth { - active: false, - charge_due: false, - within_grace: false, - has_sufficient_allowance: false, - is_paused: false, - trial_active: false, - daily_limit_set: false, - } - ); -} - -#[test] -fn test_subscription_health_active_healthy() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - let health = client.get_subscription_health(&user); - assert_eq!(health.active, true); - assert_eq!(health.charge_due, false); - assert_eq!(health.within_grace, false); - assert_eq!(health.has_sufficient_allowance, true); - assert_eq!(health.is_paused, false); - assert_eq!(health.trial_active, false); - assert_eq!(health.daily_limit_set, false); -} - -#[test] -fn test_subscription_health_paused() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.pause(&user); - - let health = client.get_subscription_health(&user); - assert_eq!(health.active, true); - assert_eq!(health.is_paused, true); - assert_eq!(health.charge_due, false); -} - -#[test] -fn test_subscription_health_trial_active() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let trial_sec = 7 * 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &Some(trial_sec), - &None, - ); - - let health = client.get_subscription_health(&user); - assert_eq!(health.trial_active, true); -} - -#[test] -fn test_subscription_health_grace_period() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.propose_grace_period(&86400); - client.commit_grace_period(); - - let interval = 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Fast-forward ledger past interval, into grace period window - env.ledger().set(soroban_sdk::testutils::LedgerInfo { - timestamp: env.ledger().timestamp() + interval + 3600, - protocol_version: 20, - sequence_number: 100, - network_id: [0u8; 32], - base_reserve: 10, - min_temp_entry_ttl: 16, - min_persistent_entry_ttl: 16, - max_entry_ttl: 3110400, - }); - - let health = client.get_subscription_health(&user); - assert_eq!(health.charge_due, true); - assert_eq!(health.within_grace, true); -} - -#[test] -fn test_subscription_health_insufficient_allowance() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Revoke allowance - token.approve(&user, &contract_id, &0, &1000); - - let health = client.get_subscription_health(&user); - assert_eq!(health.has_sufficient_allowance, false); -} - -#[test] -fn test_subscription_health_daily_limit_set() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.set_daily_limit(&user, &50_0000000); - - let health = client.get_subscription_health(&user); - assert_eq!(health.daily_limit_set, true); -} - -/// set_initial_admin with proper auth when Admin is unset succeeds and stores admin. -#[test] -fn test_set_initial_admin_success_once() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - assert!(client.get_admin().is_none()); - client.set_initial_admin(&admin); - assert_eq!(client.get_admin(), Some(admin)); -} - -/// A second set_initial_admin call must return typed AdminAlreadySet (code 42), -/// not a raw string panic, and must not change the stored admin. -#[test] -fn test_set_initial_admin_second_call_returns_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin1 = Address::generate(&env); - let admin2 = Address::generate(&env); - - client.set_initial_admin(&admin1); - assert_eq!(client.get_admin(), Some(admin1.clone())); - - let result = client.try_set_initial_admin(&admin2); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "second set_initial_admin must map to ContractError::AdminAlreadySet" - ); - - // First admin is unchanged — no partial overwrite. - assert_eq!(client.get_admin(), Some(admin1)); -} - -/// Calling set_initial_admin without the proposed admin's auth must fail with an -/// authorization error (host-level, not a contract-level typed error) and must -/// not write the admin slot. -#[test] -fn test_set_initial_admin_unauthenticated_fails() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.set_auths(&[]); - - let result = client.try_set_initial_admin(&admin); - assert!( - result.is_err(), - "set_initial_admin without proposed admin auth must fail" - ); - assert_ne!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "missing auth must be an authorization failure, not AdminAlreadySet" - ); - - assert!( - client.get_admin().is_none(), - "failed set_initial_admin must not persist admin" - ); -} - -/// Partial-init edge case: Token is already stored (e.g. from a separate -/// deploy-step) but Admin slot is still empty. set_initial_admin must still -/// require auth, succeed, and not be confused with initialize's state. -#[test] -fn test_set_initial_admin_token_present_admin_missing() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - // Simulate partial init: write Token but not Admin. - env.as_contract(&contract_id, || { - storage::set_token(&env, &token_addr); - }); - - // Sanity: token stored, admin missing. - assert_eq!(client.get_token(), Some(token_addr.clone())); - assert!(client.get_admin().is_none()); - - // set_initial_admin must still require auth and succeed. - client.set_initial_admin(&admin); - assert_eq!(client.get_admin(), Some(admin.clone())); - // Token state untouched. - assert_eq!(client.get_token(), Some(token_addr)); - - // Subsequent call returns typed error (not a panic) even in partial-init - // post-success state. - let admin2 = Address::generate(&env); - let result = client.try_set_initial_admin(&admin2); - assert_eq!( - result, - Err(Ok(soroban_sdk::Error::from_contract_error( - crate::errors::ContractError::AdminAlreadySet as u32 - ))), - "post-success second call must return AdminAlreadySet in partial-init scenario" - ); - assert_eq!(client.get_admin(), Some(admin)); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #636: validate_interval hardening -// ───────────────────────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #3)")] -fn test_subscribe_interval_zero_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &10_0000000, &0, &token_addr, &None, &None); -} - -#[test] -#[should_panic(expected = "Error(Contract, #19)")] -fn test_set_subscription_interval_below_min_interval_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &10_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - // Setting interval to 100 seconds when MinInterval is default 3600 panics with #19 (IntervalTooShort) - client.set_subscription_interval(&user, &100); -} - -// ───────────────────────────────────────────────────────────── -// Tests for Issue #637: WhitelistIndex & pagination -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_whitelist_index_size_page_and_swap_remove() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert_eq!(client.get_whitelist_size(), 0); - assert_eq!(client.get_whitelist_page(&0, &10).len(), 0); - - let m1 = Address::generate(&env); - let m2 = Address::generate(&env); - let m3 = Address::generate(&env); - - client.add_merchant(&m1); - client.add_merchant(&m2); - client.add_merchant(&m3); - - // Idempotent double add does not increment index size - client.add_merchant(&m2); - - assert_eq!(client.get_whitelist_size(), 3); - - let page_all = client.get_whitelist_page(&0, &10); - assert_eq!(page_all.len(), 3); - assert_eq!(page_all.get(0).unwrap(), m1); - assert_eq!(page_all.get(1).unwrap(), m2); - assert_eq!(page_all.get(2).unwrap(), m3); - - // Test pagination offset & limit - let page_subset = client.get_whitelist_page(&1, &1); - assert_eq!(page_subset.len(), 1); - assert_eq!(page_subset.get(0).unwrap(), m2); - - // Remove middle item (m2) -> swap-remove moves m3 into index 1 - client.remove_merchant(&m2); - assert_eq!(client.get_whitelist_size(), 2); - - let page_after_remove = client.get_whitelist_page(&0, &10); - assert_eq!(page_after_remove.len(), 2); - assert_eq!(page_after_remove.get(0).unwrap(), m1); - assert_eq!(page_after_remove.get(1).unwrap(), m3); - - // Idempotent double remove does nothing - client.remove_merchant(&m2); - assert_eq!(client.get_whitelist_size(), 2); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #2)")] -fn test_subscription_amount_validation_zero() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - // Attempt to set amount to 0 (panics with AmountMustBePositive, error 19) - env.mock_all_auths(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_amount(&user, &0); -} - -#[test] -#[should_panic(expected = "HostError: Error(Contract, #15)")] -fn test_subscription_amount_validation_exceeds_max() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - // Attempt to set amount above MAX_SUBSCRIPTION_AMOUNT - env.mock_all_auths(); - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.set_subscription_amount(&user, &(crate::MAX_SUBSCRIPTION_AMOUNT + 1)); -} - -#[test] -fn test_batch_charge_estimate() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let users = soroban_sdk::vec![&env, user.clone()]; - let estimate = client.get_batch_charge_estimate(&users); - - assert_eq!(estimate.len(), 1); - assert_eq!( - estimate.get(0).unwrap(), - crate::batch::ChargeResult::NoSubscription - ); -} - -#[test] -fn test_contract_config() { - let (env, contract_id, token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - let config = client.get_contract_config(); - assert_eq!(config.schema_version, 3); - assert_eq!(config.paused, false); -} - -#[test] -fn test_daily_spent_reset() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - client.initialize(&token_addr, &admin); - - assert!(client.get_day_start(&user).is_none()); -} - -// ───────────────────────────────────────────────────────────── -// Issue #11: extend_subscriber_index_ttl tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_extend_subscriber_index_ttl_empty_index_noop() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - assert_eq!(client.get_subscriber_count(), 0); - client.extend_subscriber_index_ttl(); - assert_eq!(client.get_subscriber_count(), 0); -} - -#[test] -fn test_extend_subscriber_index_ttl_emits_event_with_count() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let user_b = setup_funded_user(&env, &contract_id, &token_addr); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.subscribe( - &user_b, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!(client.get_subscriber_count(), 2); - - client.extend_subscriber_index_ttl(); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let count: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!( - topic_symbol, - Symbol::new(&env, "subscriber_index_ttl_extended") - ); - assert_eq!(count, 2); -} - -#[test] -fn test_extend_subscriber_index_ttl_extends_large_index() { - use soroban_sdk::testutils::storage::Persistent as _; - - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - for _ in 0..5 { - let u = setup_funded_user(&env, &contract_id, &token_addr); - client.subscribe(&u, &merchant, &1_0000000, &86400, &token_addr, &None, &None); - users.push_back(u); - } - - assert_eq!(client.get_subscriber_count(), 5); - - client.extend_subscriber_index_ttl(); - - let events = env.events().all(); - let (_, _, data) = events.get(events.len() - 1).unwrap(); - let count: u64 = data.try_into_val(&env).unwrap(); - assert_eq!(count, 5); - - env.as_contract(&contract_id, || { - let ttl = env - .storage() - .persistent() - .get_ttl(&DataKey::SubscriberIndexSize); - assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS); - - let ttl_0 = env - .storage() - .persistent() - .get_ttl(&DataKey::SubscriberIndex(0)); - assert!(ttl_0 >= SUBSCRIPTION_TTL_LEDGERS); - }); -} - -#[test] -#[should_panic] -fn test_extend_subscriber_index_ttl_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - env.set_auths(&[]); - - client.extend_subscriber_index_ttl(); -} - -// ───────────────────────────────────────────────────────────── -// Issue #838: clear_subscriber_index_entry admin repair -// ───────────────────────────────────────────────────────────── - -/// Simulate a stale index slot: the subscription is inactive but the -/// append-only index was never tombstoned (the corruption this repair -/// entrypoint is meant to fix). -fn deactivate_subscription_leaving_index(env: &Env, contract_id: &Address, user: &Address) { - env.as_contract(contract_id, || { - let mut sub = storage::get_subscription(env, user).expect("subscription"); - sub.active = false; - storage::set_subscription(env, user, &sub); - }); -} - -#[test] -fn test_clear_subscriber_index_entry_authorized_repair_tombstones_stale_slot() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - assert_eq!(client.get_subscriber_at(&0u64), Some(user.clone())); - - deactivate_subscription_leaving_index(&env, &contract_id, &user); - assert_eq!( - client.get_subscriber_at(&0u64), - Some(user.clone()), - "stale slot must still be visible before repair" - ); - - client.clear_subscriber_index_entry(&0u64); - - assert_eq!( - client.get_subscriber_at(&0u64), - None, - "repaired slot must be tombstoned" - ); - let page = client.get_subscriber_page(&0u64, &10u32); - assert_eq!(page.len(), 0); - assert_eq!( - client.get_subscriber_count(), - 1, - "repair must not shrink the append-only index" - ); -} - -#[test] -#[should_panic] -fn test_clear_subscriber_index_entry_unauthorized_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - deactivate_subscription_leaving_index(&env, &contract_id, &user); - - env.set_auths(&[]); - client.clear_subscriber_index_entry(&0u64); -} - -#[test] -#[should_panic(expected = "Error(Contract, #41)")] -fn test_clear_subscriber_index_entry_refuses_active_subscriber() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.clear_subscriber_index_entry(&0u64); -} - -#[test] -fn test_clear_subscriber_index_entry_emits_audit_event() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let admin = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - deactivate_subscription_leaving_index(&env, &contract_id, &user); - - client.clear_subscriber_index_entry(&0u64); - - let events = env.events().all(); - let (_, topics, data) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); - let index: u64 = data.try_into_val(&env).unwrap(); - - assert_eq!( - topic_symbol, - Symbol::new(&env, "subscriber_index_cleared") - ); - assert_eq!(topic_user, user); - assert_eq!(index, 0); -} - -// ───────────────────────────────────────────────────────────── -// Issue #610: get_subscription_token tests -// ───────────────────────────────────────────────────────────── - -/// get_subscription_token returns None before the user subscribes. -#[test] -fn test_get_subscription_token_none_before_subscribe() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let random = Address::generate(&env); - assert!( - client.get_subscription_token(&random).is_none(), - "get_subscription_token should return None for a user with no subscription" - ); -} - -/// get_subscription_token returns Some(token) after subscribe. -#[test] -fn test_get_subscription_token_some_after_subscribe() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - assert_eq!( - client.get_subscription_token(&user), - Some(token_addr), - "get_subscription_token should return Some(token) after subscribe" - ); -} - -/// get_subscription_token still returns Some(token) after cancel — the record -/// exists but is inactive; callers that need to distinguish active vs cancelled -/// should use get_subscription instead. -#[test] -fn test_get_subscription_token_some_after_cancel() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - client.cancel(&user); - - // The subscription record still exists (active=false), so token is still readable. - assert_eq!( - client.get_subscription_token(&user), - Some(token_addr), - "get_subscription_token should return Some(token) for cancelled subscription" - ); -} - -/// get_subscription_token reflects the token when the user re-subscribes with -/// a different token. -#[test] -fn test_get_subscription_token_updates_on_resubscribe() { - let (env, contract_id, token_a, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, &merchant, &1_0000000, &86400, &token_a, &None, &None, - ); - assert_eq!(client.get_subscription_token(&user), Some(token_a.clone())); - - let token_b = setup_second_token(&env, &contract_id, &user); - client.subscribe( - &user, &merchant, &2_0000000, &86400, &token_b, &None, &None, - ); - - assert_eq!( - client.get_subscription_token(&user), - Some(token_b), - "get_subscription_token should return the latest token after resubscribe" - ); -} - -// ───────────────────────────────────────────────────────────── -// Issue #611: propose_fee / commit_fee two-step tests -// ───────────────────────────────────────────────────────────── - -/// Full propose → commit flow sets the fee collector and bps. -#[test] -fn test_propose_and_commit_fee_sets_fee() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &250); - client.commit_fee(); - - let result = client.get_fee(); - assert!(result.is_some()); - let (stored_collector, stored_bps) = result.unwrap(); - assert_eq!(stored_collector, collector); - assert_eq!(stored_bps, 250); -} - -/// propose_fee emits a fee_proposed event. -#[test] -fn test_propose_fee_emits_fee_proposed_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &100); - - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "fee_proposed")); -} - -/// commit_fee emits a fee_committed event. -#[test] -fn test_commit_fee_emits_fee_committed_event() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &50); - client.commit_fee(); - - let events = env.events().all(); - let (_, topics, _) = events.get(events.len() - 1).unwrap(); - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); -} - -/// commit_fee without a prior propose panics with NoPendingProposal (#23). -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_commit_fee_without_proposal_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.commit_fee(); -} - -/// propose_fee with bps > 10000 panics with InvalidFeeBps (#13). -#[test] -#[should_panic(expected = "Error(Contract, #13)")] -fn test_propose_fee_invalid_bps_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &10_001); -} - -/// A re-propose before commit replaces the pending fee — commit applies -/// the latest proposal. -#[test] -fn test_repropose_before_commit_applies_latest() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector_a = Address::generate(&env); - let collector_b = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector_a, &100); - // Re-propose with different values before committing - client.propose_fee(&collector_b, &200); - client.commit_fee(); - - let (stored_collector, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_collector, collector_b); - assert_eq!(stored_bps, 200); -} - -/// After commit_fee, committing again without a new propose panics. -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_double_commit_without_repropose_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &100); - client.commit_fee(); - // Second commit without a new propose must panic - client.commit_fee(); -} - -/// Bps of exactly 10000 (100%) is valid at both propose and commit. -#[test] -fn test_propose_fee_max_valid_bps() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &10_000); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 10_000); -} - -/// Bps of 0 is valid (disabling the fee while keeping the collector). -#[test] -fn test_propose_fee_zero_bps_valid() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.propose_fee(&collector, &0); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 0); -} - -/// Non-admin calling propose_fee panics. -#[test] -#[should_panic] -fn test_propose_fee_non_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - // No admin set; require_admin call inside propose_fee should panic. - // NOTE: propose_fee in lib.rs calls bump_instance_ttl then fee::propose_fee. - // fee::propose_fee itself does not require_admin — the admin guard - // is the caller's responsibility in lib.rs. We verify the whole - // public entry point panics when no admin is configured. - let collector = Address::generate(&env); - - // Explicitly set an admin so admin check works, then revoke auths. - client.propose_fee(&collector, &100); -} - -// ───────────────────────────────────────────── -// Issue 012: commit_fee bounds re-validation -// ───────────────────────────────────────────── - -/// commit_fee rejects when bounds tightened after propose (bps above new max). -#[test] -#[should_panic(expected = "Error(Contract, #35)")] -fn test_commit_fee_rejects_when_bounds_tightened_above_max() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Propose 500 bps — within default bounds (0, 10000) - client.propose_fee(&collector, &500); - - // Tighten max to 200 bps before commit - client.set_fee_bounds(&0, &200); - - // Commit should reject 500 bps against new [0, 200] bounds - client.commit_fee(); -} - -/// commit_fee rejects when bounds tightened after propose (bps below new min). -#[test] -#[should_panic(expected = "Error(Contract, #35)")] -fn test_commit_fee_rejects_when_bounds_tightened_below_min() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Propose 50 bps - client.propose_fee(&collector, &50); - - // Raise min to 100 bps before commit - client.set_fee_bounds(&100, &10000); - - // Commit should reject 50 bps against new [100, 10000] bounds - client.commit_fee(); -} - -/// commit_fee succeeds when pending bps are within current bounds. -#[test] -fn test_commit_fee_succeeds_when_within_bounds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - client.set_fee_bounds(&10, &500); - client.propose_fee(&collector, &200); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 200); -} - -/// commit_fee succeeds when no bounds are configured (defaults to 0..10000). -#[test] -fn test_commit_fee_succeeds_with_default_bounds() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let collector = Address::generate(&env); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // No set_fee_bounds call — defaults to (0, 10000) - client.propose_fee(&collector, &750); - client.commit_fee(); - - let (_, stored_bps) = client.get_fee().unwrap(); - assert_eq!(stored_bps, 750); -} - -// ───────────────────────────────────────────── -// Batch queries tests -// ───────────────────────────────────────────── - -#[test] -fn test_get_merchant_statuses_empty() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchants = soroban_sdk::Vec::new(&env); - let result = client.get_merchant_statuses(&merchants); - assert_eq!(result.len(), 0); -} - -#[test] -fn test_get_merchant_statuses_mixed() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); -} - -// Issue #9: validate_recipient_address tests -// ───────────────────────────────────────────── - -/// set_fee() with a valid (non-contract) collector address must succeed. -#[test] -fn test_validate_recipient_address_valid_passes() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - // Must not panic — a regular address is a valid fee collector. - client.propose_fee(&collector, &100u32); - client.commit_fee(); - - assert_eq!(client.get_fee(), Some((collector, 100u32))); -} - -/// set_fee() with the contract's own address as collector must panic with -/// ContractError::InvalidFeeCollector (error code 26). -#[test] -#[should_panic(expected = "Error(Contract, #26)")] -fn test_validate_recipient_address_contract_self_panics() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - // Passing the contract address as fee collector must be rejected. - client.propose_fee(&contract_id, &100u32); - client.commit_fee(); -} -// ───────────────────────────────────────────────────────────── -// Issue #3: Per-Merchant Fee Recipient Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_set_and_get_merchant_fee_recipient() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - assert_eq!(client.get_merchant_fee_recipient(&merchant), None); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - assert_eq!( - client.get_merchant_fee_recipient(&merchant), - Some(custom_recipient) - ); -} - -#[test] -fn test_set_merchant_fee_recipient_contract_address_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let res = client.try_set_merchant_fee_recipient(&merchant, &contract_id); - assert!(res.is_err()); -} - -#[test] -fn test_merchant_fee_recipient_routing_and_fallback() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let global_collector = Address::generate(&env); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.propose_fee(&global_collector, &100); - client.commit_fee(); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - env.ledger().set_timestamp(86400); - client.charge(&user); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 990); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - env.ledger().set_timestamp(172800); - client.charge(&user); - assert_eq!(token.balance(&custom_recipient), 10); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 1980); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_merchant_statuses_exceeds_limit_panics() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut merchants = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - merchants.push_back(Address::generate(&env)); - } - client.get_merchant_statuses(&merchants); -} - -#[test] -fn test_get_next_charge_batch_empty_and_bounds() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let batch = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch.len(), 0); - - let batch_oob = client.get_next_charge_batch(&5, &10, &None); - assert_eq!(batch_oob.len(), 0); -} - -#[test] -fn test_get_next_charge_batch_filtering() { - let (env, contract_id, token_addr, user_due, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user_not_due = setup_funded_user(&env, &contract_id, &token_addr); - let user_paused = setup_funded_user(&env, &contract_id, &token_addr); - let user_cancelled = setup_funded_user(&env, &contract_id, &token_addr); - - let interval: u64 = 86400; - - client.subscribe(&user_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user_paused, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user_cancelled, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - client.pause(&user_paused); - client.cancel(&user_cancelled); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - client.subscribe(&user_not_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - let batch = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch.len(), 1); - assert_eq!(batch.get(0).unwrap(), user_due); -} - -#[test] -fn test_get_next_charge_batch_pagination() { - let (env, contract_id, token_addr, user1, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let user2 = setup_funded_user(&env, &contract_id, &token_addr); - let user3 = setup_funded_user(&env, &contract_id, &token_addr); - - let interval: u64 = 86400; - - client.subscribe(&user1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - client.subscribe(&user3, &merchant, &1_0000000, &interval, &token_addr, &None, &None); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let batch1 = client.get_next_charge_batch(&0, &2, &None); - assert_eq!(batch1.len(), 2); - assert_eq!(batch1.get(0).unwrap(), user1); - assert_eq!(batch1.get(1).unwrap(), user2); - - let batch2 = client.get_next_charge_batch(&2, &2, &None); - assert_eq!(batch2.len(), 1); - assert_eq!(batch2.get(0).unwrap(), user3); -} - -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_get_next_charge_batch_exceeds_limit_panics() { - let (env, contract_id, _, _, _) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.get_next_charge_batch(&0, &51, &None); -} - -#[test] -fn test_get_next_charge_batch_exclude_lapsed() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - let grace_period: u64 = 86400; - client.propose_grace_period(&grace_period); - client.commit_grace_period(); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &1_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - // Advance ledger beyond interval, but WITHIN grace period - env.ledger().with_mut(|l| { - l.timestamp += interval + grace_period - 100; - }); - - // It should be returned because it's due and not lapsed - let batch = client.get_next_charge_batch(&0, &10, &Some(true)); - assert_eq!(batch.len(), 1); - assert_eq!(batch.get(0).unwrap(), user); - - // Advance ledger beyond interval + grace period - env.ledger().with_mut(|l| { - l.timestamp += 200; // past the grace period - }); - - // When exclude_lapsed is Some(true) or None, it should NOT be returned - let batch_exclude = client.get_next_charge_batch(&0, &10, &Some(true)); - assert_eq!(batch_exclude.len(), 0); - - let batch_default = client.get_next_charge_batch(&0, &10, &None); - assert_eq!(batch_default.len(), 0); - - // When exclude_lapsed is Some(false), it should be returned - let batch_include = client.get_next_charge_batch(&0, &10, &Some(false)); - assert_eq!(batch_include.len(), 1); - assert_eq!(batch_include.get(0).unwrap(), user); -} - -#[test] -fn test_merchant_fee_recipient_routes_pay_per_use_and_falls_back() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let global_collector = Address::generate(&env); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - client.propose_fee(&global_collector, &100); - client.commit_fee(); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pay_per_use(&user, &1000); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 990); - - let custom_recipient = Address::generate(&env); - client.set_merchant_fee_recipient(&merchant, &custom_recipient); - - client.pay_per_use(&user, &1000); - assert_eq!(token.balance(&custom_recipient), 10); - assert_eq!(token.balance(&global_collector), 10); - assert_eq!(token.balance(&merchant), 1980); -} - -// ───────────────────────────────────────────────────────────── -// Issue #4: Bounded Pause with Auto-Resume Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_pause_until_auto_resume_on_charge() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pause_until(&user, &90000); - - env.ledger().set_timestamp(86400); - let res = client.try_charge(&user); - assert!(res.is_err()); - - env.ledger().set_timestamp(90000); - client.charge(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - assert_eq!(token.balance(&merchant), 1000); -} - -#[test] -fn test_pause_until_invalid_expiry_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - env.ledger().set_timestamp(200000); - let res = client.try_pause_until(&user, &200000); - assert!(res.is_err()); - let res2 = client.try_pause_until(&user, &150000); - assert!(res2.is_err()); -} - -#[test] -fn test_resume_clears_pause_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - client.pause_until(&user, &300000); - client.resume(&user); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - - env.as_contract(&contract_id, || { - let pause_expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(pause_expiry, None); - }); -} - -#[test] -fn test_pause_until_auto_resume_on_batch_charge_and_clears_expiry() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - client.pause_until(&user, &90000); - - env.ledger().set_timestamp(90000); - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - let result = client.batch_charge(&users); - assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); - - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.paused, false); - assert_eq!(sub.active, true); - - env.as_contract(&contract_id, || { - let pause_expiry: Option = env - .storage() - .persistent() - .get(&DataKey::PauseExpiry(user.clone())); - assert_eq!(pause_expiry, None); - }); -} - -// ───────────────────────────────────────────────────────────── -// Issue #5: get_referral Read Function Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_get_referral_lifecycle() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let referrer = Address::generate(&env); - - assert_eq!(client.get_referral(&user), None); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referral(&user), Some(referrer.clone())); - - client.cancel(&user); - assert_eq!(client.get_referral(&user), None); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - assert_eq!(client.get_referral(&user), Some(referrer)); -} - -// ───────────────────────────────────────────────────────────── -// Issue #6: Storage Migration v3 Tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_migration_v2_to_v3_populates_referrer() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let referrer = Address::generate(&env); - - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - client.subscribe( - &user, - &merchant, - &1000, - &86400, - &token_addr, - &None, - &Some(referrer.clone()), - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::SchemaVersion, &2u32); - }); - - assert_eq!(client.get_schema_version(), 2); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user.clone()); - - client.migrate(&users); - - assert_eq!(client.get_schema_version(), 3); - let sub = client.get_subscription(&user).unwrap(); - assert_eq!(sub.referrer, Some(referrer)); - - client.migrate(&users); - assert_eq!(client.get_schema_version(), 3); -} - -// ───────────────────────────────────────────────────────────── -// Issue 011: ChargeResult discriminant stability (golden tests) -// ───────────────────────────────────────────────────────────── -// -// Off-chain parsers (keepers, alert-failed-charges.ts, indexers) -// decode ChargeResult by variant index. These tests lock the -// discriminant layout so a reorder or rename is caught in CI. - -/// The number of ChargeResult variants. If you add a new variant, -/// update this count AND append the new variant at the end of the enum. -#[test] -fn test_charge_result_variant_count() { - let env = Env::default(); - let _ = env.register_contract(None, FlowPay); - - // Encode each variant via IntoVal and verify they produce distinct values. - // This also serves as a compile-time check: if a variant is removed or - // renamed, this test won't compile (exhaustive pattern match). - let charged: soroban_sdk::Val = ChargeResult::Charged.into_val(&env); - let skipped: soroban_sdk::Val = ChargeResult::Skipped.into_val(&env); - let no_sub: soroban_sdk::Val = ChargeResult::NoSubscription.into_val(&env); - let inactive: soroban_sdk::Val = ChargeResult::Inactive.into_val(&env); - let paused: soroban_sdk::Val = ChargeResult::Paused.into_val(&env); - let grace: soroban_sdk::Val = ChargeResult::GracePeriodElapsed.into_val(&env); - - // All variants must encode to distinct raw values - let c = unsafe { core::mem::transmute::(charged) }; - let s = unsafe { core::mem::transmute::(skipped) }; - let n = unsafe { core::mem::transmute::(no_sub) }; - let i = unsafe { core::mem::transmute::(inactive) }; - let p = unsafe { core::mem::transmute::(paused) }; - let g = unsafe { core::mem::transmute::(grace) }; - - assert_ne!(c, s, "Charged and Skipped must differ"); - assert_ne!(s, n, "Skipped and NoSubscription must differ"); - assert_ne!(n, i, "NoSubscription and Inactive must differ"); - assert_ne!(i, p, "Inactive and Paused must differ"); - assert_ne!(p, g, "Paused and GracePeriodElapsed must differ"); - - // Lock the variant count — increase when a variant is appended. - let total_variants = 6; - assert_eq!(total_variants, 6); -} - -/// Verify round-trip encoding for every variant. -#[test] -fn test_charge_result_round_trip() { - let env = Env::default(); - let _ = env.register_contract(None, FlowPay); - - let variants = [ - ChargeResult::Charged, - ChargeResult::Skipped, - ChargeResult::NoSubscription, - ChargeResult::Inactive, - ChargeResult::Paused, - ChargeResult::GracePeriodElapsed, - ]; - - for variant in variants.iter() { - let val: soroban_sdk::Val = variant.clone().into_val(&env); - let decoded = ChargeResult::try_from_val(&env, &val).unwrap(); - assert_eq!(*variant, decoded, "round-trip failed for a ChargeResult variant"); - } -} - -/// Verify that variant names match the expected set. -/// A rename or reorder breaks this test. -#[test] -fn test_charge_result_partial_eq_identity() { - assert_eq!(ChargeResult::Charged, ChargeResult::Charged); - assert_ne!(ChargeResult::Charged, ChargeResult::Skipped); - assert_ne!(ChargeResult::NoSubscription, ChargeResult::Inactive); - assert_ne!(ChargeResult::Paused, ChargeResult::GracePeriodElapsed); -} - - -// ───────────────────────────────────────────── -// CONTRACT-804: checked arithmetic in trial, fee, and volume paths -// ───────────────────────────────────────────── - -#[test] -fn test_extend_trial_pushes_last_charged_forward() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - let before = client.get_subscription(&user).unwrap().last_charged; - - client.extend_trial(&user, &86400); - - assert_eq!( - client.get_subscription(&user).unwrap().last_charged, - before + 86400 - ); -} - -/// A trial extension past `u64::MAX` must fail closed with the typed -/// `ArithmeticOverflow` (#36) rather than an untyped `unwrap` panic. -#[test] -fn test_extend_trial_overflow_fails_with_typed_error() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - - // Push last_charged to the u64 ceiling, then ask for one second more. - client.extend_trial(&user, &(u64::MAX - client.get_subscription(&user).unwrap().last_charged)); - assert_eq!(client.get_subscription(&user).unwrap().last_charged, u64::MAX); - - let res = client.try_extend_trial(&user, &1); - - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); -} - -/// Extending a paused subscription's trial must fail closed with the typed -/// `SubscriptionPaused` (#17) error rather than advancing `last_charged` into -/// a chargeable state. -#[test] -fn test_extend_trial_on_paused_subscription_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); - let before = client.get_subscription(&user).unwrap().last_charged; - - client.pause(&user); - - let res = client.try_extend_trial(&user, &86400); - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(17)))); - assert_eq!(client.get_subscription(&user).unwrap().last_charged, before); -} - -/// `amount * bps` must not wrap for amounts beyond the economic caps. -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_calculate_fee_amount_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - fee::calculate_fee_amount(&env, i128::MAX, 10_000); - }); -} - -#[test] -fn test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - // The largest amount the contract will accept, at the maximum bps. - assert_eq!( - fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 10_000), - MAX_SUBSCRIPTION_AMOUNT - ); - assert_eq!(fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 0), 0); - }); -} - -/// Accruing a fee onto a `TotalProtocolFees` counter at `i128::MAX` must fail -/// closed rather than wrap the protocol's own bookkeeping. -#[test] -fn test_protocol_fee_accrual_overflow_fails_with_typed_error() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - configure_fee(&env, &contract_id, 500); - - let interval: u64 = 86400; - client.subscribe( - &user, - &merchant, - &10_0000000, - &interval, - &token_addr, - &None, - &None, - ); - - env.as_contract(&contract_id, || { - env.storage() - .instance() - .set(&DataKey::TotalProtocolFees, &i128::MAX); - }); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let res = client.try_charge(&user); - assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); -} - -/// An accumulator that cannot represent the sum is an overflow (#36), which is -/// a different failure from breaching the hourly cap (#28). -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_global_volume_accumulator_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - env.storage().instance().set( - &DataKey::GlobalVolumeWindow, - &GlobalVolumeWindow { - current_window_start: env.ledger().timestamp(), - accumulated_volume: i128::MAX, - }, - ); - check_and_update_global_volume(&env, 1); - }); -} - -/// A window start near `u64::MAX` must not wrap the rollover comparison. -#[test] -#[should_panic(expected = "Error(Contract, #36)")] -fn test_global_volume_window_end_overflow_fails_with_typed_error() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - env.storage().instance().set( - &DataKey::GlobalVolumeWindow, - &GlobalVolumeWindow { - current_window_start: u64::MAX, - accumulated_volume: 0, - }, - ); - check_and_update_global_volume(&env, 1); - }); -} - -/// Breaching the hourly cap still reports `GlobalVolumeExceeded` (#28) — -/// the overflow work above must not have changed the cap's error mapping. -#[test] -#[should_panic(expected = "Error(Contract, #28)")] -fn test_global_volume_cap_breach_still_reports_28() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - - env.as_contract(&contract_id, || { - check_and_update_global_volume(&env, GLOBAL_MAX_VOLUME_PER_HOUR + 1); - }); -} - -// ───────────────────────────────────────────── -// CONTRACT-805: batch_charge_skips summary event -// ───────────────────────────────────────────── - -/// Helper: returns the payload of the single `batch_charge_skips` event in the -/// event log, or `None` when no such event was emitted. -fn find_batch_charge_skips(env: &Env) -> Option { - let mut found = None; - for (_, topics, data) in env.events().all().iter() { - let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); - if topic_symbol == Symbol::new(env, "batch_charge_skips") { - assert_eq!( - topics.len(), - 1, - "batch_charge_skips carries no address topic" - ); - assert!( - found.is_none(), - "at most one summary event per batch_charge call" - ); - found = Some(data.try_into_val(env).unwrap()); - } - } - found -} - -/// Helper: funds a fresh user and subscribes them for `interval`. -fn subscribe_funded_user( - env: &Env, - contract_id: &Address, - token_addr: &Address, - merchant: &Address, - interval: u64, -) -> Address { - let client = FlowPayClient::new(env, contract_id); - let user = Address::generate(env); - let sac = StellarAssetClient::new(env, token_addr); - sac.mint(&user, &10_000_0000000); - let token = TokenClient::new(env, token_addr); - token.approve(&user, contract_id, &10_000_0000000, &200000); - client.subscribe( - &user, - merchant, - &1_0000000, - &interval, - token_addr, - &None, - &None, - ); - user -} - -/// A batch mixing charges with paused / cancelled / missing / grace-elapsed -/// subscriptions emits one summary event whose counts reconcile with the -/// returned results. -#[test] -fn test_batch_charge_emits_skips_summary_with_counts() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - install_admin(&env, &contract_id); - client.propose_grace_period(&3600); - client.commit_grace_period(); - - let paused_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let cancelled_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let grace_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let unknown_user = Address::generate(&env); - - client.pause(&paused_user); - client.cancel(&cancelled_user); - - // Push grace_user past its interval AND its grace window. - env.ledger().with_mut(|l| { - l.timestamp += interval + 3601 + 1; - }); - - // Subscribe the chargeable user now, then advance just past its interval so - // it is due but still inside the grace window. - let chargeable = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(chargeable.clone()); - users.push_back(paused_user.clone()); - users.push_back(cancelled_user.clone()); - users.push_back(grace_user.clone()); - users.push_back(unknown_user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), ChargeResult::Paused); - assert_eq!(results.get(2).unwrap(), ChargeResult::Inactive); - assert_eq!(results.get(3).unwrap(), ChargeResult::GracePeriodElapsed); - assert_eq!(results.get(4).unwrap(), ChargeResult::NoSubscription); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 5); - assert_eq!(summary.charged, 1); - assert_eq!(summary.not_due, 0); - assert_eq!(summary.paused, 1); - assert_eq!(summary.inactive, 1); - assert_eq!(summary.grace_elapsed, 1); - assert_eq!(summary.no_subscription, 1); - assert_eq!(summary.ledger_sequence, env.ledger().sequence()); - - // The counts must account for every submitted address. - assert_eq!( - summary.charged - + summary.not_due - + summary.paused - + summary.inactive - + summary.grace_elapsed - + summary.no_subscription - + summary.allowance_insufficient, - summary.total - ); -} - -/// An all-success batch must not emit the summary — and its `charged` events -/// are unchanged. -#[test] -fn test_batch_charge_all_charged_emits_no_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!(results.get(1).unwrap(), ChargeResult::Charged); - - assert!( - find_batch_charge_skips(&env).is_none(), - "an all-charged batch must stay silent" - ); - - // `charged` events are untouched by this feature. - let charged_events = env - .events() - .all() - .iter() - .filter(|(_, topics, _)| { - let s: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); - s == Symbol::new(&env, "charged") - }) - .count(); - assert_eq!(charged_events, 2); -} - -/// Not-due skips are the common, uninteresting outcome and must not emit. -#[test] -fn test_batch_charge_not_due_only_emits_no_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(user_a.clone()); - users.push_back(user_b.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Skipped); - assert_eq!(results.get(1).unwrap(), ChargeResult::Skipped); - - assert!( - find_batch_charge_skips(&env).is_none(), - "a not-due-only batch must stay silent" - ); -} - -/// An allowance shortfall is a per-user `AllowanceInsufficient` result (it does -/// not abort the batch) and is an interesting failure: it alone must emit the -/// summary, since a keeper needs to know a subscriber has to re-approve. -#[test] -fn test_batch_charge_allowance_insufficient_counted_in_skips_summary() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - let interval: u64 = 86400; - - let ok_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let broke_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - - // One stroop short of the gross subscription amount. - token.approve(&broke_user, &contract_id, &(1_0000000 - 1), &200000); - - env.ledger().with_mut(|l| { - l.timestamp += interval + 1; - }); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(ok_user.clone()); - users.push_back(broke_user.clone()); - - let results = client.batch_charge(&users); - assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); - assert_eq!( - results.get(1).unwrap(), - ChargeResult::AllowanceInsufficient - ); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 2); - assert_eq!(summary.charged, 1); - assert_eq!(summary.allowance_insufficient, 1); - assert_eq!(summary.not_due, 0); - assert_eq!( - summary.charged - + summary.not_due - + summary.paused - + summary.inactive - + summary.grace_elapsed - + summary.no_subscription - + summary.allowance_insufficient, - summary.total - ); -} - -/// A single interesting failure alongside not-due skips is enough to emit, -/// and the not-due count rides along for reconciliation. -#[test] -fn test_batch_charge_single_interesting_failure_emits_with_not_due_count() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let interval: u64 = 86400; - - let not_due_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); - let unknown_user = Address::generate(&env); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(not_due_user.clone()); - users.push_back(unknown_user.clone()); - - client.batch_charge(&users); - - let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); - assert_eq!(summary.total, 2); - assert_eq!(summary.not_due, 1); - assert_eq!(summary.no_subscription, 1); - assert_eq!(summary.charged, 0); -} - -// ───────────────────────────────────────────────────────────── -// Issue #801 (Issue 005): simulate_charge / get_batch_charge_estimate -// parity matrix. -// ───────────────────────────────────────────────────────────── -// -// These cases exhaust the existing skip/pause/grace/inactive/ -// not-due/missing-subscription/contract-paused matrix and -// verify that both dry-run surfaces reach semantically -// equivalent decisions (modulo the intentional enum-mapping -// differences documented in charge_exec.rs at -// DryRunSkipOutcome::into_sim_result / into_batch_result). - -/// Semantic skip-category labels shared by the parity matrix. -/// The test asserts that both callers land in the same -/// high-level category for each scenario. -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -enum ParityCategory { - NoSubscription, - ContractPaused, - SubscriptionPaused, - Inactive, - NotDue, - GracePeriodElapsed, - WouldCharge, -} - -fn categorize_sim(r: &ChargeSimResult) -> ParityCategory { - match r { - ChargeSimResult::WouldSucceed => ParityCategory::WouldCharge, - ChargeSimResult::NotDue => ParityCategory::NotDue, - ChargeSimResult::Inactive => ParityCategory::Inactive, - ChargeSimResult::InsufficientAllowance => ParityCategory::WouldCharge, - ChargeSimResult::GracePeriodElapsed => ParityCategory::GracePeriodElapsed, - ChargeSimResult::ContractPaused => ParityCategory::ContractPaused, - ChargeSimResult::SubscriptionPaused => ParityCategory::SubscriptionPaused, - } -} - -fn categorize_batch(r: &ChargeResult) -> ParityCategory { - match r { - ChargeResult::Charged => ParityCategory::WouldCharge, - ChargeResult::Skipped => ParityCategory::NotDue, - ChargeResult::NoSubscription => ParityCategory::NoSubscription, - ChargeResult::Inactive => ParityCategory::Inactive, - ChargeResult::Paused => ParityCategory::SubscriptionPaused, - ChargeResult::GracePeriodElapsed => ParityCategory::GracePeriodElapsed, - ChargeResult::AllowanceInsufficient => ParityCategory::WouldCharge, - } -} - -/// Returns (now, interval, grace_period, amount) constants for -/// the parity test setup so row config is readable. -struct ParityConfig { - interval: u64, - grace: u64, - amount: i128, -} - -const PARITY_CFG: ParityConfig = ParityConfig { - interval: 86400, - grace: 3600, - amount: 1_0000000, -}; - -/// Description and setup function for a single parity-matrix -/// row. Setup runs inside a fresh `setup()` context. The -/// returned label is printed on assertion failure so it is -/// clear which row diverged. -struct ParityRow { - label: &'static str, - expected: ParityCategory, - setup: fn(env: &Env, client: &FlowPayClient, user: &Address, merchant: &Address, token_addr: &Address, contract_id: &Address), -} - -fn parity_rows() -> std::vec::Vec { - std::vec![ - ParityRow { - label: "no subscription", - expected: ParityCategory::NoSubscription, - setup: |_env, _client, _user, _merchant, _token_addr, _contract_id| { - // Intentionally do not subscribe the user. - }, - }, - ParityRow { - label: "contract paused", - expected: ParityCategory::ContractPaused, - setup: |env, client, user, merchant, token_addr, contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); - env.as_contract(contract_id, || { - storage::set_contract_paused(env, true); - }); - }, - }, - ParityRow { - label: "paused indefinitely", - expected: ParityCategory::SubscriptionPaused, - setup: |_env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - client.pause(user); - }, - }, - ParityRow { - label: "paused with expiry — before expiry reached", - expected: ParityCategory::SubscriptionPaused, - setup: |env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - let now = env.ledger().timestamp(); - let expiry = now + 600; - client.pause_until(user, &expiry); - env.ledger().with_mut(|l| l.timestamp = expiry - 1); - }, - }, - ParityRow { - label: "paused with expiry — at expiry + interval not yet elapsed (auto-resume -> not due)", - expected: ParityCategory::NotDue, - setup: |env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - let now = env.ledger().timestamp(); - // expiry well before interval would be due - let expiry = now + 600; - client.pause_until(user, &expiry); - // advance to exactly expiry (auto-resumes), but subscription - // interval is 86400s so charge is not yet due. - env.ledger().with_mut(|l| l.timestamp = expiry); - }, - }, - ParityRow { - label: "paused with expiry — past expiry + interval elapsed (auto-resume -> would charge)", - expected: ParityCategory::WouldCharge, - setup: |env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - let now = env.ledger().timestamp(); - let expiry = now + 600; - client.pause_until(user, &expiry); - // past both expiry and interval. - env.ledger().with_mut(|l| l.timestamp = expiry + PARITY_CFG.interval + 1); - }, - }, - ParityRow { - label: "inactive (cancelled)", - expected: ParityCategory::Inactive, - setup: |env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - client.cancel(user); - env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); - }, - }, - ParityRow { - label: "not due (interval not elapsed)", - expected: ParityCategory::NotDue, - setup: |_env, client, user, merchant, token_addr, _contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - // Immediately after subscribe, next charge is interval away. - }, - }, - ParityRow { - label: "due and within grace window", - expected: ParityCategory::WouldCharge, - setup: |env, client, user, merchant, token_addr, contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - env.as_contract(contract_id, || { - env.storage() - .instance() - .set(&DataKey::GracePeriod, &PARITY_CFG.grace); - }); - // Advance past interval but still inside grace window. - env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); - }, - }, - ParityRow { - label: "grace period elapsed", - expected: ParityCategory::GracePeriodElapsed, - setup: |env, client, user, merchant, token_addr, contract_id| { - client.subscribe( - user, merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - token_addr, &None, &None, - ); - env.as_contract(contract_id, || { - env.storage() - .instance() - .set(&DataKey::GracePeriod, &PARITY_CFG.grace); - }); - env.ledger().with_mut(|l| { - l.timestamp += PARITY_CFG.interval + PARITY_CFG.grace + 1; - }); - }, - }, - ParityRow { - label: "missing subscription (fresh user, never subscribed)", - expected: ParityCategory::NoSubscription, - setup: |_env, _client, _user, _merchant, _token_addr, _contract_id| { - // Nothing to do; user has never subscribed. - }, - }, - ] -} - -#[test] -fn test_simulate_and_batch_estimate_skip_parity_matrix() { - let rows = parity_rows(); - for row in rows.iter() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - (row.setup)(&env, &client, &user, &merchant, &token_addr, &contract_id); - - let sim = client.simulate_charge(&user); - let sim_cat = categorize_sim(&sim); - - let users_vec = soroban_sdk::vec![&env, user.clone()]; - let estimates = client.get_batch_charge_estimate(&users_vec); - let est = estimates.get(0).expect("estimate vec has one entry"); - let est_cat = categorize_batch(&est); - - // ═══════════════════════════════════════════════════════ - // The two rows below are the *only* places where the - // parity matrix tolerates a divergence: - // (1) NoSubscription: simulate_charge returns Inactive - // (historic API); estimate returns NoSubscription - // (matches live batch_charge). Category labels - // differ intentionally; both mean "no charge". - // (2) ContractPaused: simulate_charge returns - // ContractPaused; estimate has no matching variant - // (ChargeResult is frozen for off-chain consumers) - // so it falls back to Inactive. Both callers - // agree that the charge would not proceed. - // ═══════════════════════════════════════════════════════ - let est_cat_adjusted = match (row.expected, est_cat) { - (ParityCategory::NoSubscription, ParityCategory::NoSubscription) => { - // simulate collapses missing -> Inactive category. - ParityCategory::Inactive - } - (ParityCategory::ContractPaused, ParityCategory::Inactive) => { - // estimate maps contract-paused -> Inactive. - ParityCategory::ContractPaused - } - _ => est_cat, - }; - - assert_eq!( - sim_cat, est_cat_adjusted, - "parity divergence on row '{}': simulate={:?} (cat={:?}), estimate={:?} (cat={:?})", - row.label, sim, sim_cat, est, est_cat, - ); - assert_eq!( - sim_cat, row.expected, - "simulate_charge reached wrong category on row '{}': got {:?}, want {:?}", - row.label, sim_cat, row.expected, - ); - } -} - -/// Additional, narrower check: when both dry-run surfaces say -/// "would charge", neither has mutated storage (the virtual -/// auto-resume inside the shared precheck must remain local). -#[test] -fn test_estimate_does_not_perform_auto_resume_storage_writes() { -// Issue 041 (#836): MerchantFeeRecipient clearing tests -// ───────────────────────────────────────────────────────────── - -#[test] -fn test_merchant_fee_recipient_cleared_on_remove_and_freeze() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let client = FlowPayClient::new(&env, &contract_id); - let recipient = Address::generate(&env); - - client.add_merchant(&merchant); - client.set_merchant_fee_recipient(&merchant, &recipient); - assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); - - client.remove_merchant(&merchant); - assert_eq!(client.get_merchant_fee_recipient(&merchant), None); - - client.add_merchant(&merchant); - client.set_merchant_fee_recipient(&merchant, &recipient); - assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); - - client.freeze_merchant(&merchant, &None); - assert_eq!(client.get_merchant_fee_recipient(&merchant), None); -} - -// ───────────────────────────────────────────────────────────── -// Issue 033 (#828): Grace period TTL expiry tests -// ───────────────────────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #23)")] -fn test_grace_period_commit_expired_proposal_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let client = FlowPayClient::new(&env, &contract_id); - client.propose_grace_period(&3600); - - env.ledger().with_mut(|l| { - l.sequence_number += 20000; - }); - - client.commit_grace_period(); -} - -#[test] -fn test_grace_period_propose_commit_happy_path() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let admin = Address::generate(&env); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &admin); - }); - - let client = FlowPayClient::new(&env, &contract_id); - client.propose_grace_period(&7200); - - env.ledger().with_mut(|l| { - l.sequence_number += 100; - }); - - client.commit_grace_period(); - assert_eq!(client.get_grace_period(), 7200); -} - -// ───────────────────────────────────────────────────────────── -// Issue 034 (#829): Self-transfer & contract-as-user hazards -// ───────────────────────────────────────────────────────────── - -#[test] -#[should_panic(expected = "Error(Contract, #32)")] -fn test_transfer_subscription_self_transfer_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, &merchant, - &PARITY_CFG.amount, &PARITY_CFG.interval, - &token_addr, &None, &None, - ); - let now = env.ledger().timestamp(); - let expiry = now + 600; - client.pause_until(&user, &expiry); - env.ledger().with_mut(|l| l.timestamp = expiry + PARITY_CFG.interval + 1); - - // Sanity-check: user is currently paused in storage. - let sub_before = client.get_subscription(&user).unwrap(); - assert!(sub_before.paused, "sub must be paused before estimate call"); - let pause_expiry_before = env.as_contract(&contract_id, || { - storage::get_pause_expiry(&env, &user) - }); - assert!(pause_expiry_before.is_some(), "pause expiry must exist"); - - // Run the estimate — must be WouldCharge (via virtual auto-resume). - let users_vec = soroban_sdk::vec![&env, user.clone()]; - let estimates = client.get_batch_charge_estimate(&users_vec); - assert_eq!( - estimates.get(0).unwrap(), - ChargeResult::Charged, - "estimate should report WouldCharge via virtual auto-resume" - ); - let sim = client.simulate_charge(&user); - assert_eq!( - sim, - ChargeSimResult::WouldSucceed, - "simulate_charge should agree on WouldSucceed" - ); - - // CRITICAL: after the dry-run, storage must still show paused=true - // and pause expiry must still be present. If either changed, the - // estimate path is leaking state writes (a regression from Issue - // 005's shared helper). - let sub_after = client.get_subscription(&user).unwrap(); - assert!( - sub_after.paused, - "estimate call must NOT write auto-resume to storage; sub.paused remained true" - ); - let pause_expiry_after = env.as_contract(&contract_id, || { - storage::get_pause_expiry(&env, &user) - }); - assert!( - pause_expiry_after.is_some(), - "estimate call must NOT clear pause_expiry storage key" - ); -} - -/// Parity: the existing successful charge path is unchanged. -/// We run a full cycle end-to-end and assert funds moved the -/// same way they did before the Issue 005 refactor. -#[test] -fn test_successful_charge_path_unchanged_after_issue_005() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - let token = TokenClient::new(&env, &token_addr); - - let amount: i128 = 5_0000000; - let interval: u64 = 86400; - - client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); - - // Both dry-runs should say "not due" immediately. - assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); - let uvec = soroban_sdk::vec![&env, user.clone()]; - assert_eq!( - client.get_batch_charge_estimate(&uvec).get(0).unwrap(), - ChargeResult::Skipped - ); - - let user_before = token.balance(&user); - let merchant_before = token.balance(&merchant); - - env.ledger().with_mut(|l| l.timestamp += interval + 1); - - // Now both dry-runs should say "would charge". - assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); - assert_eq!( - client.get_batch_charge_estimate(&uvec).get(0).unwrap(), - ChargeResult::Charged - ); - - // Live charge should actually move funds. - client.charge(&user); - - assert_eq!(user_before - token.balance(&user), amount); - assert_eq!(token.balance(&merchant) - merchant_before, amount); -} - - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &user); -} - -#[test] -#[should_panic(expected = "Error(Contract, #32)")] -fn test_transfer_subscription_to_contract_address_panics() { - let (env, contract_id, token_addr, user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); - - client.transfer_subscription(&user, &contract_id); -} - -#[test] -#[should_panic(expected = "Error(Contract, #32)")] -fn test_subscribe_self_subscription_panics() { - let (env, contract_id, token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &user, - &user, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -} - -#[test] -#[should_panic(expected = "Error(Contract, #32)")] -fn test_subscribe_contract_as_user_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - client.subscribe( - &contract_id, - &merchant, - &1_0000000, - &86400, - &token_addr, - &None, - &None, - ); -// Issue #813: batch_charge stress / resource-envelope coverage -// -// These tests exercise `batch_charge` at the configured max batch size and one -// above it, matching the resource envelope documented for `set_max_batch_size`. -// Soroban's per-invocation budget is finite, so each test resets it to -// unlimited up front (`env.budget().reset_unlimited()`, as the existing -// `test_batch_charge_stress` does) so the setup + one `batch_charge` invocation -// is measured without being throttled by the 200 M default budget. -// -// Approximate resource usage for a max-size batch at the default cap (50): -// - cost(n) ~= 50 x (storage read + fee + token transfer_from + events) -// - at a configured cap of 5 the per-entry cost is identical; only `n` varies. -// The relevant ceiling enforced here is the batch-size check in `batch.rs`, -// which fires *before* any charging, so exceeding the cap panics with -// `ContractError::BatchTooLarge` (#20) rather than executing partial work. - -/// Batch-charge exactly the configured max batch size; all entries succeed. -#[test] -fn test_batch_charge_at_configured_max() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - install_admin(&env, &contract_id); - let client = FlowPayClient::new(&env, &contract_id); - - let batch_limit: u32 = 5; - client.set_max_batch_size(&batch_limit); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..batch_limit { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - let results = client.batch_charge(&users); - assert_eq!(results.len(), batch_limit); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } - for i in 0..batch_limit { - let u = users.get(i).unwrap(); - assert!(client.get_subscription(&u).unwrap().active); - } -} - -/// Batch-charge one above the configured max panics with BatchTooLarge (#20). -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_above_configured_max_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - install_admin(&env, &contract_id); - let client = FlowPayClient::new(&env, &contract_id); - - let batch_limit: u32 = 5; - client.set_max_batch_size(&batch_limit); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..=batch_limit { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - client.batch_charge(&users); -} - -/// Batch-charge the default max (50) without explicit configuration succeeds. -#[test] -fn test_batch_charge_at_default_max() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..50 { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - let results = client.batch_charge(&users); - assert_eq!(results.len(), 50); - for r in results.into_iter() { - assert_eq!(r, crate::ChargeResult::Charged); - } - for i in 0..50u32 { - let u = users.get(i).unwrap(); - assert!(client.get_subscription(&u).unwrap().active); - } -} - -/// Batch-charge one above the default max panics with BatchTooLarge (#20). -#[test] -#[should_panic(expected = "Error(Contract, #20)")] -fn test_batch_charge_over_default_max_panics() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - env.budget().reset_unlimited(); - let client = FlowPayClient::new(&env, &contract_id); - - let mut users = soroban_sdk::Vec::new(&env); - for _ in 0..51 { - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - users.push_back(u); - } - - env.ledger().with_mut(|l| { - l.timestamp += 86400 + 1; - }); - - client.batch_charge(&users); -} - -// -// Issue #810: authorization-boundary tests -// -// Each admin entrypoint is tested in two states: -// (a) success with admin auth called via the normal client method inside -// `mock_all_auths` -// (b) panic when no admin is set called via try_* so the contract error is -// surfaced as an Err, not a hard panic -// -// Note: `setup()` enables `env.mock_all_auths()`, so a "non-admin rejected" -// variant cannot force `require_admin` to fail in this environment; rejection -// is instead covered by the no-admin panic path and the contract's own -// `require_admin` guard. -// - -// -- freeze_merchant ---------------------------------------------------------- - -/// Admin can freeze a merchant (happy path). -#[test] -fn test_freeze_merchant_admin_success() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.freeze_merchant(&merchant, &None); - - assert!(client.is_merchant_frozen(&merchant)); -} - -/// freeze_merchant panics when no admin has been set. -#[test] -fn test_freeze_merchant_no_admin_panics() { - let (env, contract_id, _token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_freeze_merchant(&merchant, &None); - assert!(result.is_err()); -} - -// -- propose_fee -------------------------------------------------------------- - -/// Admin can propose a fee (happy path). -#[test] -fn test_propose_fee_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - - assert_eq!(client.get_fee(), None); -} - -/// propose_fee panics when no admin has been set. -#[test] -fn test_propose_fee_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let collector = Address::generate(&env); - let result = client.try_propose_fee(&collector, &100); - assert!(result.is_err()); -} - -// -- set_min_interval --------------------------------------------------------- - -/// Admin can set min_interval (happy path). -#[test] -fn test_set_min_interval_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_min_interval(&7200); - assert_eq!(client.get_min_interval(), 7200); -} - -/// set_min_interval panics when no admin has been set. -#[test] -fn test_set_min_interval_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_min_interval(&7200); - assert!(result.is_err()); -} - -// -- batch_cancel ------------------------------------------------------------- - -/// Admin can batch-cancel subscriptions (happy path). -#[test] -fn test_batch_cancel_admin_success() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(u.clone()); - - client.batch_cancel(&users); - - let sub = client.get_subscription(&u).unwrap(); - assert!(!sub.active); -} - -/// batch_cancel panics when no admin has been set. -#[test] -fn test_batch_cancel_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_batch_cancel(&users); - assert!(result.is_err()); -} - -// -- whitelist_batch_add ------------------------------------------------------ - -/// Admin can batch-add merchants to the whitelist (happy path). -#[test] -fn test_whitelist_batch_add_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); - - let added = client.whitelist_batch_add(&merchants); - assert_eq!(added, 2); -} - -/// whitelist_batch_add panics when no admin has been set. -#[test] -fn test_whitelist_batch_add_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let merchants = soroban_sdk::Vec::new(&env); - let result = client.try_whitelist_batch_add(&merchants); - assert!(result.is_err()); -} - -// -- batch_pause_subscriptions ------------------------------------------------ - -/// Admin can batch-pause subscriptions (happy path). -#[test] -fn test_batch_pause_subscriptions_admin_success() { - let (env, contract_id, token_addr, _user, merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); - - let mut users = soroban_sdk::Vec::new(&env); - users.push_back(u.clone()); - - client.batch_pause_subscriptions(&users); - - let sub = client.get_subscription(&u).unwrap(); - assert!(sub.paused); -} - -/// batch_pause_subscriptions panics when no admin has been set. -#[test] -fn test_batch_pause_subscriptions_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_batch_pause_subscriptions(&users); - assert!(result.is_err()); -} - -// -- clear_fee ---------------------------------------------------------------- - -/// Admin can clear fee (happy path). -#[test] -fn test_clear_fee_admin_success() { - let (env, contract_id, _token_addr, user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - env.as_contract(&contract_id, || { - storage::set_admin(&env, &user); - }); - - let collector = Address::generate(&env); - client.propose_fee(&collector, &100); - client.commit_fee(); - assert!(client.get_fee().is_some()); - - client.clear_fee(); - assert_eq!(client.get_fee(), None); -} - -/// clear_fee panics when no admin has been set. -#[test] -fn test_clear_fee_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_clear_fee(); - assert!(result.is_err()); -} - -// -- set_whitelist_enabled ---------------------------------------------------- - -/// Admin can toggle whitelist on/off (happy path). -#[test] -fn test_set_whitelist_enabled_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_whitelist_enabled(&true); - assert!(client.is_whitelist_enabled()); - - client.set_whitelist_enabled(&false); - assert!(!client.is_whitelist_enabled()); -} - -/// set_whitelist_enabled panics when no admin has been set. -#[test] -fn test_set_whitelist_enabled_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_whitelist_enabled(&true); - assert!(result.is_err()); -} - -// -- set_max_batch_size ------------------------------------------------------- - -/// Admin can set max_batch_size (happy path). -#[test] -fn test_set_max_batch_size_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_max_batch_size(&100); - assert_eq!(client.get_max_batch_size(), 100); -} - -/// set_max_batch_size panics when no admin has been set. -#[test] -fn test_set_max_batch_size_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_max_batch_size(&100); - assert!(result.is_err()); -} - -// -- pause_contract ----------------------------------------------------------- - -/// Admin can pause the contract (happy path). -#[test] -fn test_pause_contract_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.pause_contract(); - assert!(client.is_contract_paused()); -} - -/// pause_contract panics when no admin has been set. -#[test] -fn test_pause_contract_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_pause_contract(); - assert!(result.is_err()); -} - -// -- migrate ------------------------------------------------------------------ - -/// Admin can run storage migration (happy path). -#[test] -fn test_migrate_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - client.migrate(&users); - assert_eq!(client.get_schema_version(), 3); -} - -/// migrate panics when no admin has been set. -#[test] -fn test_migrate_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let users = soroban_sdk::Vec::new(&env); - let result = client.try_migrate(&users); - assert!(result.is_err()); -} - -// -- set_global_volume_cap ---------------------------------------------------- - -/// Admin can set the global volume cap (happy path). -#[test] -fn test_set_global_volume_cap_admin_success() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - install_admin(&env, &contract_id); - - client.set_global_volume_cap(&100_0000000); - assert_eq!(client.get_global_volume_cap(), 100_0000000); -} - -/// set_global_volume_cap panics when no admin has been set. -#[test] -fn test_set_global_volume_cap_no_admin_panics() { - let (env, contract_id, _token_addr, _user, _merchant) = setup(); - let client = FlowPayClient::new(&env, &contract_id); - - let result = client.try_set_global_volume_cap(&100_0000000); - assert!(result.is_err()); -} - - +-#![cfg(test)] +#![allow( + clippy::bool_assert_comparison, + unused_variables, + dead_code, + clippy::inconsistent_digit_grouping +)] + +use super::*; +use soroban_sdk::{ + testutils::{Address as _, Events as _, Ledger}, + token::{Client as TokenClient, StellarAssetClient}, + Address, BytesN, Env, IntoVal, Symbol, TryFromVal, TryIntoVal, Vec, +}; + +/// Returns (env, contract_id, token_addr, user, merchant) +fn setup() -> (Env, Address, Address, Address, Address) { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + (env, contract_id, token_addr, user, merchant) +} + +/// Helper: deploy second token +fn setup_second_token(env: &Env, contract_id: &Address, user: &Address) -> Address { + let token_admin = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let sac = StellarAssetClient::new(env, &token_addr); + sac.mint(user, &10_000_0000000); + + let token = TokenClient::new(env, &token_addr); + token.approve(user, contract_id, &10_000_0000000, &200000); + + token_addr +} + +fn setup_funded_user(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200); + + user +} + +fn assert_last_event(env: &Env, topic: &str) { + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let data_unit: () = data.try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(data_unit, ()); +} + +fn assert_last_user_event(env: &Env, topic: &str, user: &Address) { + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(topic_user, user.clone()); +} + +fn count_user_events(env: &Env, topic: &str, user: &Address) -> u32 { + let expected_topic = Symbol::new(env, topic); + let mut count = 0; + + for (_, topics, _) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol != expected_topic { + continue; + } + + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + if topic_user == user.clone() { + count += 1; + } + } + + count +} + +// ───────────────────────────────────────────── +// Core functionality tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_and_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!(sub.token, token_addr); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + assert!(sub_after.last_charged > 0); +} +#[test] +fn test_subscription_age_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + env.ledger().with_mut(|l| { + l.timestamp = 1; + }); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed: u64 = 1000; + env.ledger().with_mut(|l| { + l.timestamp += elapsed; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed)); +} + +#[test] +fn test_subscription_age_resets_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 5000; + }); + + client.cancel(&user); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed_after_resub: u64 = 200; + env.ledger().with_mut(|l| { + l.timestamp += elapsed_after_resub; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed_after_resub)); +} + +#[test] +fn test_subscription_age_none_when_no_subscription() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_subscription_age_none_for_migrated_sentinel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Simulate a pre-existing subscription migrated with the created_at = 0 sentinel + env.as_contract(&contract_id, || { + let key = crate::DataKey::Subscription(user.clone()); + let mut sub: crate::Subscription = env.storage().persistent().get(&key).unwrap(); + sub.created_at = 0; + env.storage().persistent().set(&key, &sub); + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_batch_charge_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let results = client.batch_charge(&soroban_sdk::vec![&env]); + assert_eq!(results.len(), 0); +} + +/// charge() must decrease user balance and increase merchant balance by exactly the subscription amount. +#[test] +fn test_charge_exact_transfer_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by exactly the subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by exactly the subscription amount" + ); +} + +#[test] +fn test_charged_event_includes_ledger_sequence() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + l.sequence_number += 7; + }); + + client.charge(&user); + + let mut seen_charge_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "charged") { + let event_data: crate::events::ChargeEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.ledger_sequence, env.ledger().sequence()); + seen_charge_event = true; + } + } + + assert!(seen_charge_event, "expected a charged event"); +} + +#[test] +fn test_charge_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +#[test] +fn test_charge_routes_net_to_custom_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + // merchant sets a custom recipient (directly write persistent storage for test) + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&DataKey::MerchantFeeRecipient(merchant.clone()), &recipient); + env.storage().persistent().extend_ttl( + &DataKey::MerchantFeeRecipient(merchant.clone()), + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + }); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let recipient_before = token.balance(&recipient); + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_fee); + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +// ───────────────────────────────────────────── +// CONTRACT-802: gross-allowance preflight before the two-leg fee transfer +// ───────────────────────────────────────────── + +/// Helper: installs an admin and commits `bps` with a fresh collector. +fn configure_fee(env: &Env, contract_id: &Address, bps: u32) -> Address { + let client = FlowPayClient::new(env, contract_id); + install_admin(env, contract_id); + let collector = Address::generate(env); + client.propose_fee(&collector, &bps); + client.commit_fee(); + collector +} + +/// An allowance exactly equal to the gross amount must cover BOTH transfer +/// legs (fee + net) when fee_bps > 0. +#[test] +fn test_charge_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Tighten the allowance to exactly the gross amount — not a stroop more. + token.approve(&user, &contract_id, &amount, &200000); + assert_eq!(token.allowance(&user, &contract_id), amount); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + // Both legs drew on the same allowance, consuming it exactly. + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// One stroop short of the gross amount must fail closed with the typed +/// `InsufficientAllowance` (#8) and move no funds on either leg. +#[test] +fn test_charge_allowance_below_gross_fails_closed_before_any_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &(amount - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let res = client.try_charge(&user); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + // Neither leg ran: the fee leg alone would have fit in the allowance. + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// A fee that rounds down to zero still charges the full gross amount and +/// needs the full gross allowance. +#[test] +fn test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + // 1 * 500 / 10_000 == 0 — the fee leg is skipped entirely. + let amount: i128 = 1; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), amount); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// The maximum in-bounds fee (10_000 bps == 100%) sends everything to the +/// collector and still passes the single gross preflight. +#[test] +fn test_charge_max_bps_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 10_000); // 100% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), amount); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// pay_per_use runs the same two-leg pattern and the same preflight. +#[test] +fn test_pay_per_use_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + token.approve(&user, &contract_id, &amount, &200000); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +#[test] +fn test_pay_per_use_allowance_below_gross_fails_closed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + token.approve(&user, &contract_id, &(amount - 1), &200000); + + let res = client.try_pay_per_use(&user, &amount); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + assert_eq!(token.balance(&collector), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +// ───────────────────────────────────────────── +// Issue #837 / Issue 042: shared allowance-requirement helper +// ───────────────────────────────────────────── + +struct AllowanceReqCase { + allowance: i128, + gross: i128, + fee_bps: u32, + expected: bool, + label: &'static str, +} + +/// Table-driven unit tests for the shared allowance helper: zero, exact, and +/// insufficient allowance, plus fee-off vs fee-on gross (never net-only). +#[test] +fn test_allowance_covers_gross_table() { + let gross: i128 = 10_000; + let fee_on_bps: u32 = 500; // 5% + let fee_on_net: i128 = gross - (gross * fee_on_bps as i128 / 10_000); // 9_500 + + let cases = [ + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: 0, + expected: false, + label: "zero allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "zero allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: 0, + expected: true, + label: "exact allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "exact gross allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: 0, + expected: false, + label: "insufficient (one stroop short), fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "insufficient (one stroop short of gross), fee_bps > 0", + }, + AllowanceReqCase { + allowance: fee_on_net, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "fee-on net-only allowance is insufficient vs gross", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: 0, + expected: true, + label: "surplus allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "surplus allowance, fee_bps > 0", + }, + ]; + + for c in cases { + assert_eq!( + validation::required_allowance(c.gross, c.fee_bps), + c.gross, + "required allowance must be gross ({})", + c.label + ); + assert_eq!( + validation::allowance_covers_gross(c.allowance, c.gross, c.fee_bps), + c.expected, + "{}", + c.label + ); + } +} + +struct SimulateAllowanceCase { + fee_bps: u32, + allowance: i128, + expected: ChargeSimResult, + label: &'static str, +} + +/// `simulate_charge` uses the shared helper: fee-off and fee-on both require +/// the gross amount, so a net-only allowance fails when fees are on. +#[test] +fn test_simulate_charge_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SimulateAllowanceCase { + fee_bps: 0, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "insufficient allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact gross allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "one stroop short of gross, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expected: ChargeSimResult::InsufficientAllowance, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + token.approve(&user, &contract_id, &c.allowance, &200000); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + assert_eq!(client.simulate_charge(&user), c.expected, "{}", c.label); + } +} + +struct SubscribeAllowanceCase { + fee_bps: u32, + allowance: i128, + expect_ok: bool, + label: &'static str, +} + +/// subscribe() validation uses the same gross-allowance helper, including +/// when protocol fees are configured (requirement is still the gross amount). +#[test] +fn test_subscribe_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SubscribeAllowanceCase { + fee_bps: 0, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount, + expect_ok: true, + label: "exact allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expect_ok: false, + label: "insufficient allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expect_ok: true, + label: "exact gross allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expect_ok: false, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + token.approve(&user, &contract_id, &c.allowance, &200000); + let result = + client.try_subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + if c.expect_ok { + assert!(result.is_ok(), "{}", c.label); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, amount, "{}", c.label); + } else { + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error(8))), + "{}", + c.label + ); + assert!( + client.get_subscription(&user).is_none(), + "failed subscribe must not write storage ({})", + c.label + ); + } + } +} + +/// `has_sufficient_allowance` reads SAC allowance and never transfers. +#[test] +fn test_has_sufficient_allowance_does_not_transfer() { + let (env, contract_id, token_addr, user, _merchant) = setup(); + let token = TokenClient::new(&env, &token_addr); + let amount: i128 = 1_0000000; + let balance_before = token.balance(&user); + + env.as_contract(&contract_id, || { + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + }); + + token.approve(&user, &contract_id, &0, &200000); + + env.as_contract(&contract_id, || { + assert!(!validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + 0 + )); + }); + + assert_eq!(token.balance(&user), balance_before); +} + +// Note: setter input validation is covered in contract code; invoking it directly +// via the generated client isn't available in these tests. The storage-level +// behavior for routing is covered by the tests above. + +#[test] +fn test_charge_with_zero_fee_bps_skips_fee_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +/// subscribe() must store all Subscription fields exactly as provided. +#[test] +fn test_subscription_struct_fields_match_input() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + let subscribe_time = env.ledger().timestamp(); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + + assert_eq!(sub.merchant, merchant, "merchant should match"); + assert_eq!(sub.amount, amount, "amount should match"); + assert_eq!(sub.interval, interval, "interval should match"); + assert!(sub.active, "subscription should be active"); + assert!(!sub.paused, "subscription should not be paused"); + assert_eq!(sub.token, token_addr, "token should match"); + // last_charged is set to subscribe time when no trial period + assert_eq!( + sub.last_charged, subscribe_time, + "last_charged should be set to subscribe time" + ); +} + +// ───────────────────────────────────────────── +// Issue #194: get_trial_end() tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_trial_end_with_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let now = env.ledger().timestamp(); + let trial_period: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(trial_period), + &None, + ); + + assert_eq!(client.get_trial_end(&user), Some(now + trial_period)); +} + +#[test] +fn test_get_trial_end_without_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_trial_end(&user).is_none()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #6)")] +fn test_charge_before_trial_end_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(86400u64), + &None, + ); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_subscribe_non_whitelisted_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_whitelisted_merchant_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.add_merchant(&merchant); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); + assert!(client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_is_merchant_whitelisted_returns_false_for_non_whitelisted() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_set_whitelist_enabled_false_allows_any_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.set_whitelist_enabled(&false); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); +} + +#[test] +fn test_get_whitelist_enabled_defaults_to_true() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(client.get_whitelist_enabled()); +} + +#[test] +fn test_get_whitelist_enabled_toggles() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Default is true + assert!(client.get_whitelist_enabled()); + + // False after set_whitelist_enabled(false) + client.set_whitelist_enabled(&false); + assert!(!client.get_whitelist_enabled()); + + // True after re-enabling + client.set_whitelist_enabled(&true); + assert!(client.get_whitelist_enabled()); +} + +// ───────────────────────────────────────────── +// Merchant freeze tests +// ───────────────────────────────────────────── + +/// subscribe to a frozen merchant panics with ContractError::MerchantFrozen. +#[test] +#[should_panic(expected = "Error(Contract, #22)")] +fn test_subscribe_to_frozen_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// An existing subscriber can still be charged after their merchant is frozen — +/// freeze only blocks new subscriptions, not existing charge cycles. +#[test] +fn test_charge_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, interval + 1); +} + +/// pay_per_use is unaffected by merchant freeze status for an existing subscriber. +#[test] +fn test_pay_per_use_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 1_0000000); +} + +/// is_merchant_frozen reflects freeze/unfreeze state changes. +#[test] +fn test_is_merchant_frozen_reflects_state() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert!(!client.is_merchant_frozen(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// Freezing a merchant that is not whitelisted must still succeed — the two +/// states (whitelist, freeze) are independent of each other. +#[test] +fn test_freeze_merchant_independent_of_whitelist() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Merchant is not whitelisted at all, and whitelist enforcement is off. + assert!(!client.is_merchant_whitelisted(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +/// freeze_merchant is idempotent — freezing an already-frozen merchant must not panic. +#[test] +fn test_freeze_merchant_idempotent() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); +} + +/// unfreeze_merchant on a non-frozen merchant must not panic. +#[test] +fn test_unfreeze_merchant_non_frozen_is_noop() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_freeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.freeze_merchant(&merchant, &None); +} + +/// unfreeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_unfreeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.unfreeze_merchant(&merchant); +} + +#[test] +#[should_panic] +fn test_non_admin_add_and_remove_merchant_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.add_merchant(&merchant); + client.remove_merchant(&merchant); +} + +// ───────────────────────────────────────────── +// CONTRACT-20: whitelist_batch_add / whitelist_batch_remove tests +// ───────────────────────────────────────────── + +#[test] +fn test_whitelist_batch_add_three_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + merchants.push_back(m3.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 3); + assert!(client.is_merchant_whitelisted(&m1)); + assert!(client.is_merchant_whitelisted(&m2)); + assert!(client.is_merchant_whitelisted(&m3)); +} + +#[test] +fn test_whitelist_batch_remove_two_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + client.add_merchant(&m1); + client.add_merchant(&m2); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 2); + assert!(!client.is_merchant_whitelisted(&m1)); + assert!(!client.is_merchant_whitelisted(&m2)); +} + +#[test] +fn test_whitelist_batch_add_duplicates_does_not_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 2); + assert!(client.is_merchant_whitelisted(&m1)); +} + +#[test] +fn test_whitelist_batch_remove_non_whitelisted_is_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 1); + assert!(!client.is_merchant_whitelisted(&m1)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic] +fn test_whitelist_batch_add_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(merchant.clone()); + client.whitelist_batch_add(&merchants); +} + +// ───────────────────────────────────────────── +// CONTRACT-803: configurable whitelist batch limit +// ───────────────────────────────────────────── + +/// Helper: installs a generated admin so admin-gated entrypoints are callable. +fn install_admin(env: &Env, contract_id: &Address) { + let admin = Address::generate(env); + env.as_contract(contract_id, || { + storage::set_admin(env, &admin); + }); +} + +/// Helper: installs an admin and returns a Vec of `n` freshly generated merchants. +fn whitelist_admin_and_merchants( + env: &Env, + contract_id: &Address, + n: u32, +) -> soroban_sdk::Vec
{ + install_admin(env, contract_id); + + let mut merchants = soroban_sdk::Vec::new(env); + for _ in 0..n { + merchants.push_back(Address::generate(env)); + } + merchants +} + +#[test] +fn test_max_whitelist_batch_size_defaults_to_50() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + assert_eq!(client.get_max_whitelist_batch_size(), 50); + // The whitelist knob is independent of the charge-batch knob. + client.set_max_batch_size(&10); + assert_eq!(client.get_max_whitelist_batch_size(), 50); + assert_eq!(client.get_max_batch_size(), 10); +} + +#[test] +fn test_set_max_whitelist_batch_size_lowers_cap() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + client.set_max_whitelist_batch_size(&2); + assert_eq!(client.get_max_whitelist_batch_size(), 2); + + // Exactly at the configured cap still succeeds. + assert_eq!(client.whitelist_batch_add(&merchants), 2); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_remove_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_remove(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_raised_whitelist_batch_cap_allows_more_than_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 51); + + // 51 entries panic under the default cap; raising the cap admits them. + client.set_max_whitelist_batch_size(&60); + assert_eq!(client.whitelist_batch_add(&merchants), 51); + assert_eq!(client.get_whitelist_size(), 51); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_above_ceiling_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&(MAX_BATCH_SIZE_CEILING + 1)); +} + +#[test] +#[should_panic] +fn test_set_max_whitelist_batch_size_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + client.set_max_whitelist_batch_size(&10); +} + +#[test] +fn test_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_referral_cleared_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.cancel(&user); + + assert_eq!(client.get_referrer(&user), None); +} + +#[test] +#[should_panic] +fn test_charge_too_early() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.charge(&user); +} + +// ───────────────────────────────────────────── +// Multi-token + advanced features +// ───────────────────────────────────────────── + +#[test] +fn test_multi_token_independent_subscriptions() { + let (env, contract_id, token_a, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let token_b = setup_second_token(&env, &contract_id, &user_b); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, &merchant, &amount, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user_b, &merchant, &amount, &interval, &token_b, &None, &None, + ); + + let sub_a = client.get_subscription(&user_a).unwrap(); + let sub_b = client.get_subscription(&user_b).unwrap(); + + assert_eq!(sub_a.token, token_a); + assert_eq!(sub_b.token, token_b); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); + client.charge(&user_b); +} + +#[test] +fn test_user_can_switch_token() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let token_b = setup_second_token(&env, &contract_id, &user); + let interval: u64 = 86400; + + client.subscribe( + &user, &merchant, &1_0000000, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user, &merchant, &2_0000000, &interval, &token_b, &None, &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let token = TokenClient::new(&env, &token_addr); + let before = token.balance(&merchant); + + client.pay_per_use(&user, &5_0000000); + + assert_eq!(token.balance(&merchant), before + 5_0000000); +} + +#[test] +fn test_pay_per_use_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +// ───────────────────────────────────────────── +// CONTRACT-23: pay_per_use_to tests +// ───────────────────────────────────────────── + +#[test] +fn test_pay_per_use_to_transfers_to_recipient_not_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 5_0000000; + let merchant_before = token.balance(&merchant); + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&merchant), merchant_before); + assert_eq!(token.balance(&recipient) - recipient_before, amount); + assert_eq!(client.get_merchant_revenue(&recipient), amount); + assert_eq!(client.get_merchant_revenue(&merchant), 0); +} + +#[test] +fn test_pay_per_use_to_applies_protocol_fee_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let recipient_before = token.balance(&recipient); + let collector_before = token.balance(&collector); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&recipient), expected_net); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_rejects_non_whitelisted_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.add_merchant(&merchant); + client.set_whitelist_enabled(&true); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let recipient = Address::generate(&env); // never whitelisted + client.pay_per_use_to(&user, &1_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + + client.pay_per_use_to(&user, &amount, &merchant); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_daily_limit_shared_with_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + + client.pay_per_use(&user, &6_0000000); + // Combined spend (6 + 6 = 12) exceeds the 10 limit, even though this + // second call routes through pay_per_use_to to a different recipient. + client.pay_per_use_to(&user, &6_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_with_zero_fee_bps_transfers_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pay_per_use(&user, &1_0000000); +} + +/// pay_per_use() must not update last_charged, confirming it is independent of the recurring billing cycle. +#[test] +fn test_pay_per_use_does_not_update_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + let last_charged_before = sub_before.last_charged; + + // Advance ledger time so we can verify last_charged isn't simply matching the current time + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; + }); + + client.pay_per_use(&user, &5_0000000); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.last_charged, last_charged_before, + "pay_per_use should not update last_charged" + ); +} + +#[test] +#[should_panic] +fn test_pay_per_use_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.pay_per_use(&random, &1_0000000); +} + +// ───────────────────────────────────────────── +// Edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_pay_per_use_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_exceeds_cap() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &(MAX_AMOUNT + 1)); +} + +/// initialize() still works for backward compat but is not required. +#[test] +fn test_initialize_backward_compat() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // initialize with a default token — should not affect per-sub token + client.initialize(&token_addr, &admin); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe(&user, &merchant, &1_0000000, &86400, &token_b, &None, &None); + + // Subscription uses token_b, not the initialized default + assert_eq!(client.get_subscription(&user).unwrap().token, token_b); +} + +// ── Issue #14: cancel nonexistent subscription ─────────────────────────────── + +/// cancel() must panic with "no subscription found" when called on a user with no subscription. +#[test] +#[should_panic] +fn test_cancel_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.cancel(&random); +} + +// ── Issue #13: get_subscription for nonexistent subscription ───────────────── + +/// get_subscription() must return None for an address with no subscription. +#[test] +fn test_get_subscription_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription(&random).is_none(), + "get_subscription should return None for unknown address" + ); +} +// ── Issue #12: last_charged timestamp update ───────────────────────────────── + +/// charge() must update last_charged to the current ledger timestamp. +#[test] +fn test_charge_updates_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Record the timestamp before advancing time + let subscribe_time = env.ledger().timestamp(); + + // Advance ledger time past interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; // advance by interval + 1000 seconds + }); + + // Record the timestamp right before charge + let charge_time = env.ledger().timestamp(); + assert!( + charge_time > subscribe_time, + "charge time should be after subscribe time" + ); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + // Verify last_charged is exactly equal to the charge_time + assert_eq!( + sub_after.last_charged, charge_time, + "last_charged should equal the ledger timestamp at charge time" + ); +} + +#[test] +#[should_panic] +fn test_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &0, &86400, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_zero_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_interval_too_short() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &59, &token_addr, &None, &None); +} + +#[test] +fn test_interval_minimum_valid() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +// ───────────────────────────────────────────── +// Multi-user isolation +// ───────────────────────────────────────────── + +#[test] +fn test_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let merchant_b = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount_a: i128 = 1_0000000; + let amount_b: i128 = 2_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant_a, + &amount_a, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant_b, + &amount_b, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); +} + +// ───────────────────────────────────────────── +// Cancel + charge edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_charge_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + client.charge(&user); +} + +// ───────────────────────────────────────────── +// batch_charge tests +// ───────────────────────────────────────────── + +#[test] +fn test_batch_charge_charged_and_skipped() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let interval: u64 = 86400; + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Only advance past interval for user_a + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // user_b re-subscribes at the new timestamp so their interval hasn't elapsed + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); +} + +#[test] +fn test_batch_charge_ordering() { + let (env, contract_id, token_addr, user_1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_2 = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_2, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_2, &contract_id, &10_000_0000000, &200); + + let user_3 = Address::generate(&env); + // user_3 has no subscription + + let user_4 = Address::generate(&env); + sac.mint(&user_4, &10_000_0000000); + token.approve(&user_4, &contract_id, &10_000_0000000, &200); + + let interval = 86400; + + // user_1: valid, will be charged + client.subscribe( + &user_1, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_2: valid, will be charged + client.subscribe( + &user_2, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe( + &user_4, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) + users.push_back(user_2.clone()); + users.push_back(user_3.clone()); + users.push_back(user_4.clone()); + users.push_back(user_1.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); + assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); +} + +#[test] +fn test_batch_charge_no_subscription() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(unknown); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::NoSubscription); +} + +#[test] +#[cfg(feature = "bench")] +fn test_batch_charge_stress() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + env.budget().reset_unlimited(); + + let num_users = 50; + let mut users = soroban_sdk::Vec::new(&env); + let interval = 86400; + + for _ in 0..num_users { + let u = Address::generate(&env); + sac.mint(&u, &10_000_0000000); + token.approve(&u, &contract_id, &10_000_0000000, &200); + client.subscribe( + &u, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), num_users); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } +} + +#[test] +#[cfg(feature = "bench")] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = Address::generate(&env); + users.push_back(u); + users.push_back(Address::generate(&env)); + } + + let res = client.try_batch_charge(&users); + assert!(res.is_err()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_batch_size_rejects_value_above_200() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_max_batch_size(&201); +} + +#[test] +#[should_panic] +fn test_non_admin_set_max_batch_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.set_auths(&[]); + client.set_max_batch_size(&10); +} + +#[test] +fn test_cancel_and_refund_prorated_transfers_expected_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 900; + }); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 7_500_000 + ); + assert_eq!(token.balance(&user), user_balance_before + 7_500_000); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_cancel_and_refund_prorated_at_period_start_refunds_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 1_0000000 + ); + assert_eq!(token.balance(&user), user_balance_before + 1_0000000); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +#[should_panic(expected = "Error(Contract, #39)")] +fn test_cancel_and_refund_prorated_at_interval_end_rejects_zero_refund() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 3600; + }); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #38)")] +fn test_cancel_and_refund_prorated_rejects_wrong_merchant() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let actual_merchant = Address::generate(&env); + + client.subscribe( + &user, + &actual_merchant, + &1_0000000, + &3600, + &_token_addr, + &None, + &None, + ); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_cancel_and_refund_prorated_missing_subscription_panics() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +fn test_cancel_and_refund_prorated_underfunded_merchant_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| l.timestamp = 1800); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert_eq!(token.balance(&merchant), merchant_balance_before); + assert_eq!(token.balance(&user), user_balance_before); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_inactive_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_paused_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(sub.paused); +} + +#[test] +fn test_batch_charge_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Inactive); +} + +/// batch_charge must return ChargeResult::Paused for a subscription that has been paused. +#[test] +fn test_batch_charge_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Paused); +} + +/// Issue #201: batch_charge applies protocol fees identically to charge(). +#[test] +fn test_batch_charge_with_fee() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + let collector = Address::generate(&env); + let fee_bps: u32 = 100; // 1% + client.propose_fee(&collector, &fee_bps); + client.commit_fee(); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 10_000_000; // 1 XLM + let interval: u64 = 86400; + let expected_fee = amount * (fee_bps as i128) / 10_000; + let expected_net = amount - expected_fee; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_a_balance_before = token.balance(&user_a); + let user_b_balance_before = token.balance(&user_b); + let merchant_balance_before = token.balance(&merchant); + let collector_balance_before = token.balance(&collector); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Charged); + + assert_eq!( + user_a_balance_before - token.balance(&user_a), + amount, + "user_a debited gross amount" + ); + assert_eq!( + user_b_balance_before - token.balance(&user_b), + amount, + "user_b debited gross amount" + ); + assert_eq!( + token.balance(&merchant) - merchant_balance_before, + expected_net * 2, + "merchant receives net per user" + ); + assert_eq!( + token.balance(&collector) - collector_balance_before, + expected_fee * 2, + "collector receives fee per user" + ); +} + +#[test] +fn test_batch_charge_grace_period_elapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::GracePeriodElapsed + ); +} + +// ----------------------------------------------------------------- +// Issue #794: batch_charge AllowanceInsufficient tolerance tests +// ----------------------------------------------------------------- + +/// A subscriber with zero allowance receives AllowanceInsufficient; no funds move. +#[test] +fn test_batch_charge_zero_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Revoke the allowance entirely. + token.approve(&user, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "zero allowance must produce AllowanceInsufficient" + ); + assert_eq!(token.balance(&user), user_balance_before, "user balance unchanged"); + assert_eq!(token.balance(&merchant), merchant_balance_before, "merchant balance unchanged"); +} + +/// A subscriber whose allowance is exactly the subscription amount is charged. +#[test] +fn test_batch_charge_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the gross amount. + token.approve(&user, &contract_id, &amount, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::Charged, + "exact allowance must allow the charge" + ); + assert_eq!( + token.balance(&user), + 10_000_0000000 - amount, + "user debited gross amount" + ); +} + +/// A subscriber with allowance one stroop below sub.amount is rejected. +#[test] +fn test_batch_charge_one_below_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to one stroop below gross. + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); +} + +/// Mixed batch: Alice (sufficient) -> Bob (insufficient) -> Charlie (sufficient). +/// Bob's failure must not abort Alice's or Charlie's charges. +#[test] +fn test_batch_charge_mixed_allowance_does_not_abort_healthy_users() { + let (env, contract_id, token_addr, alice, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let bob = Address::generate(&env); + let charlie = Address::generate(&env); + sac.mint(&bob, &10_000_0000000); + sac.mint(&charlie, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&alice, &bob, &charlie] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + // Bob revokes to an insufficient amount. + token.approve(&bob, &contract_id, &(amount / 2), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let alice_before = token.balance(&alice); + let bob_before = token.balance(&bob); + let charlie_before = token.balance(&charlie); + let merchant_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(alice.clone()); + users.push_back(bob.clone()); + users.push_back(charlie.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged, "Alice charged"); + assert_eq!( + results.get(1).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "Bob insufficient" + ); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged, "Charlie charged"); + + assert_eq!(alice_before - token.balance(&alice), amount, "Alice debited"); + assert_eq!(token.balance(&bob), bob_before, "Bob untouched"); + assert_eq!(charlie_before - token.balance(&charlie), amount, "Charlie debited"); + assert_eq!( + token.balance(&merchant) - merchant_before, + amount * 2, + "merchant received exactly 2 charges" + ); +} + +/// Multiple under-allowanced users in one batch all return AllowanceInsufficient. +#[test] +fn test_batch_charge_multiple_insufficient_allowances() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let user_b = Address::generate(&env); + sac.mint(&user_b, &10_000_0000000); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + + for u in [&user_a, &user_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(u, &contract_id, &(amount - 1), &200); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let a_before = token.balance(&user_a); + let b_before = token.balance(&user_b); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(token.balance(&user_a), a_before); + assert_eq!(token.balance(&user_b), b_before); +} + +/// Healthy user before AND after an under-allowanced user both get charged. +#[test] +fn test_batch_charge_healthy_before_and_after_insufficient() { + let (env, contract_id, token_addr, healthy_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let insufficient = Address::generate(&env); + let healthy_b = Address::generate(&env); + sac.mint(&insufficient, &10_000_0000000); + sac.mint(&healthy_b, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&healthy_a, &insufficient, &healthy_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + token.approve(&insufficient, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let ha_before = token.balance(&healthy_a); + let hb_before = token.balance(&healthy_b); + let ins_before = token.balance(&insufficient); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(healthy_a.clone()); + users.push_back(insufficient.clone()); + users.push_back(healthy_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged); + + assert_eq!(ha_before - token.balance(&healthy_a), amount); + assert_eq!(token.balance(&insufficient), ins_before); + assert_eq!(hb_before - token.balance(&healthy_b), amount); +} + +/// Auto-resume + insufficient allowance: subscription resumes but charge fails cleanly. +#[test] +fn test_batch_charge_auto_resume_with_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + client.pause_until(&user, &90_000); + + // Revoke allowance while paused. + token.approve(&user, &contract_id, &0, &200); + + // Advance past both the pause expiry and the charge interval. + env.ledger().set_timestamp(90_001); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "auto-resume + zero allowance must not panic" + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(!sub.paused); +} + +/// get_batch_charge_estimate returns AllowanceInsufficient for an under-allowanced +/// due subscriber, mirroring the live batch behavior. +#[test] +fn test_batch_charge_estimate_reflects_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::AllowanceInsufficient + ); +} + +/// Allowance check is against gross sub.amount, NOT the post-fee net amount. +/// Allowance == net (< gross) must still return AllowanceInsufficient. +#[test] +fn test_batch_charge_allowance_checked_against_gross_not_net() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let admin = Address::generate(&env); + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + crate::storage::set_admin(&env, &admin); + }); + // 10% fee: net = 90% of gross. + client.propose_fee(&collector, &1000); + client.commit_fee(); + + let gross: i128 = 1_0000000; + let net: i128 = gross - gross * 1000 / 10_000; // 9_000_000 + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &gross, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the net amount -- below gross. + token.approve(&user, &contract_id, &net, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "allowance == net but < gross must still fail" + ); + assert_eq!(token.balance(&user), user_balance_before, "no funds moved"); +} + +// ───────────────────────────────────────────── +// subscription_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_active_count_increments_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_active_count(), 0); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); +} + +#[test] +fn test_active_count_does_not_double_count_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_active_count_decrements_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + client.cancel(&user); + assert_eq!(client.get_active_count(), 0); +} + +#[test] +fn test_active_count_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 2); + + client.cancel(&user_a); + assert_eq!(client.get_active_count(), 1); +} + +// ───────────────────────────────────────────── +// merchant_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_from_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_merchant_revenue(&merchant), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +fn test_merchant_revenue_from_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &3_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +#[test] +fn test_merchant_revenue_accumulates() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +// ───────────────────────────────────────────── +// spending_limit tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_daily_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Initial limit should be None + assert_eq!(client.get_daily_limit(&user), None); + + // After setting, it should return Some(limit) + client.set_daily_limit(&user, &10_0000000); + assert_eq!(client.get_daily_limit(&user), Some(10_0000000)); +} + +#[test] +fn test_get_daily_limit_status_absent_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: None, + spent: 0, + day_start: None, + remaining: None, + } + ); +} + +#[test] +fn test_get_daily_limit_status_snapshot_and_rollover() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + client.pay_per_use(&user, &2_0000000); + + let status = client.get_daily_limit_status(&user); + assert_eq!(status.limit, Some(10_0000000)); + assert_eq!(status.spent, 2_0000000); + assert_eq!(status.remaining, Some(8_0000000)); + assert_eq!(status.day_start, client.get_day_start(&user)); + + env.as_contract(&contract_id, || { + env.storage().temporary().extend_ttl( + &DataKey::DailyLimit(user.clone()), + 35000, + 35000, + ); + }); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += 17281; + }); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: Some(10_0000000), + spent: 0, + day_start: None, + remaining: Some(10_0000000), + } + ); +} + +#[test] +fn test_daily_limit_allows_spend_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + // Should not panic + client.pay_per_use(&user, &5_0000000); +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &5_0000000); +} + +#[test] +fn test_daily_limit_accumulates_across_calls() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &2_0000000); + client.pay_per_use(&user, &2_0000000); + // 4 total, limit is 5 — should pass +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_cumulative_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &3_0000000); + client.pay_per_use(&user, &3_0000000); // 6 total > 5 limit +} + +#[test] +fn test_daily_limit_visibility_and_spend_tracking() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_daily_limit(&user), None); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &4_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); + + client.pay_per_use(&user, &1_0000000); + assert_eq!(client.get_daily_spent(&user), 1_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); +} + +#[test] +fn test_get_day_start_visibility() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // No window before any spend + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &10_0000000); + // Setting a limit alone does not open the day window + assert!(client.get_day_start(&user).is_none()); + + client.pay_per_use(&user, &2_0000000); + assert!(client.get_day_start(&user).is_some()); + assert_eq!(client.get_daily_spent(&user), 2_0000000); + + client.remove_daily_limit(&user); + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); +} + +#[test] +fn test_daily_limit_set_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let limit: i128 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "daily_limit_set")); + assert_eq!(topic_user, user); + assert_eq!(limit, 4_0000000); +} + +#[test] +fn test_daily_limit_removed_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + client.remove_daily_limit(&user); + + assert_eq!(client.get_daily_limit(&user), None); + assert_last_user_event(&env, "daily_limit_removed", &user); +} + +#[test] +fn test_remove_daily_limit_allows_pay_per_use_after_removal() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &2_0000000); + client.remove_daily_limit(&user); + client.pay_per_use(&user, &2_0000000); // should succeed after removal +} + +// ───────────────────────────────────────────── +// Contract admin event tests +// ───────────────────────────────────────────── + +#[test] +fn test_contract_pause_events_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.pause_contract(); + assert!(client.is_contract_paused()); + assert_last_event(&env, "contract_paused"); + + client.unpause_contract(); + assert!(!client.is_contract_paused()); + assert_last_event(&env, "contract_unpaused"); +} + +// ───────────────────────────────────────────── +// Migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_v1_to_v2() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Manually construct and store a V1 subscription + let v1_sub = crate::migration::SubscriptionV1 { + merchant: merchant.clone(), + amount: 1_0000000, + interval: 86400, + last_charged: env.ledger().timestamp(), + active: true, + token: token_addr.clone(), + referrer: None, + label: Symbol::new(&env, "v1_label"), + trial_duration: 0, + }; + + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&crate::DataKey::Subscription(user.clone()), &v1_sub); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + // Verify it was upgraded to V2 + let v2_sub = client.get_subscription(&user).unwrap(); + assert_eq!(v2_sub.merchant, merchant); + assert_eq!(v2_sub.amount, 1_0000000); + assert_eq!(v2_sub.active, true); + assert_eq!(v2_sub.paused, false); // This is the newly added field + assert_eq!(v2_sub.label, Symbol::new(&env, "v1_label")); +} + +#[test] +fn test_admin_batch_pause_subscriptions_freezes_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 1); +} + +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + + let mut users = Vec::new(&env); + users.push_back(missing_user.clone()); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert!(client.get_subscription(&missing_user).is_none()); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let mut users = Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_upgrade_event_emitted() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[7; 32]); + client.upgrade(&new_wasm_hash); + + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let mock_wasm_hash = BytesN::from_array(&env, &[0u8; 32]); + env.as_contract(&contract_id, || { + events::publish_upgraded(&env, &mock_wasm_hash); + }); + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "upgrade")); +} + +// ───────────────────────────────────────────────────────────── +// Issue #45: get_pending_upgrade tests +// ───────────────────────────────────────────────────────────── + +/// Returns None when no upgrade has been proposed. +#[test] +fn test_get_pending_upgrade_none_when_not_proposed() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert_eq!(client.get_pending_upgrade(), None); +} + +/// Returns the proposed WASM hash after propose_upgrade is called. +#[test] +fn test_get_pending_upgrade_returns_proposed_hash() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xAB; 32]); + client.propose_upgrade(&new_wasm_hash); + + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); +} + +/// Returns None after commit_upgrade consumes the pending hash. +#[test] +fn test_get_pending_upgrade_none_after_commit() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xCD; 32]); + client.propose_upgrade(&new_wasm_hash); + + // Hash is visible before commit + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); + + client.commit_upgrade(); + + // Cleared after commit + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_cancel_pending_upgrade_clears_pending_upgrade_and_emits_event() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xEF; 32]); + client.propose_upgrade(&new_wasm_hash); + client.cancel_pending_upgrade(); + + assert_eq!(client.get_pending_upgrade(), None); + assert_last_event(&env, "upg_cancelled"); +} + +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_upgrade_requires_pending_upgrade_after_cancel() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + client.cancel_pending_upgrade(); + client.commit_upgrade(); +} + +#[test] +fn test_pending_upgrade_expires() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS + 1; + }); + + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_repropose_refreshes_pending_upgrade_ttl() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let first_hash = BytesN::from_array(&env, &[0x01; 32]); + let second_hash = BytesN::from_array(&env, &[0x02; 32]); + client.propose_upgrade(&first_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + client.propose_upgrade(&second_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + + assert_eq!(client.get_pending_upgrade(), Some(second_hash)); +} + +/// A second propose_upgrade overwrites the first pending hash. +#[test] +fn test_get_pending_upgrade_overwritten_by_second_proposal() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let hash_a = BytesN::from_array(&env, &[0x01; 32]); + let hash_b = BytesN::from_array(&env, &[0x02; 32]); + + client.propose_upgrade(&hash_a); + assert_eq!(client.get_pending_upgrade(), Some(hash_a)); + + client.propose_upgrade(&hash_b); + assert_eq!(client.get_pending_upgrade(), Some(hash_b)); +} +// ───────────────────────────────────────────── +// ───────────────────────────────────────────────────────────── +// Issue #96: referral tracking tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_referral_stored_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + assert_eq!(client.get_referrer(&user), Some(referrer)); +} + +#[test] +fn test_no_referral_returns_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_referral_updates_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer_a = Address::generate(&env); + let referrer_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer_a.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_a)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &Some(referrer_b.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_b)); +} + +#[test] +fn test_grace_period_ttl_extension() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Ensure an admin is set so admin checks pass. + let admin = Address::generate(&env); + // Write admin as the contract to set instance storage from the test harness. + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + // Set a grace period as admin and verify read returns the same value. + let seconds: u64 = 3600; + client.propose_grace_period(&seconds); + client.commit_grace_period(); + let got = client.get_grace_period(); + assert_eq!(got, seconds); +} + +#[test] +#[should_panic(expected = "Error(Contract, #1)")] +fn test_double_initialize() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.initialize(&token_addr, &admin); +} + +// ───────────────────────────────────────────── +// Issue #839 / Issue 044: deploy-facing initialize invariants +// Relied on by scripts/deploy-pipeline.ts and scripts/testnet-setup.ts. +// Signature must remain initialize(token, admin). Failures that scripts map +// must be ContractError (AlreadyInitialized = 1), not a host string panic. +// ───────────────────────────────────────────── + +/// Successful initialize persists both the default token and the admin. +/// Deploy health checks require `token_configured` and `admin_configured`. +#[test] +fn test_initialize_deploy_invariant_persists_token_and_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + assert_eq!( + client.get_token(), + Some(token_addr.clone()), + "initialize must persist the token readable via get_token" + ); + assert_eq!( + client.get_admin(), + Some(admin.clone()), + "initialize must persist the admin readable via get_admin" + ); + + let report = client.contract_health_check(); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +/// Storage read used by deploy scripts: get_admin returns the initialized admin. +#[test] +fn test_initialize_deploy_invariant_stored_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Storage read used by deploy scripts: get_token returns the initialized token. +#[test] +fn test_initialize_deploy_invariant_stored_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_token().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +/// A second initialize must return typed AlreadyInitialized (code 1), not a string panic. +#[test] +fn test_initialize_deploy_invariant_double_init_already_initialized() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + let result = client.try_initialize(&token_addr, &admin); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "double initialize must map to ContractError::AlreadyInitialized" + ); + + // First initialize state is unchanged. + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Initialize without admin authorization must fail and must not persist token or admin. +#[test] +fn test_initialize_deploy_invariant_requires_admin_auth() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_initialize(&token_addr, &admin); + assert!(result.is_err(), "initialize without admin auth must fail"); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "missing admin auth is an authorization failure, not AlreadyInitialized" + ); + + assert!( + client.get_token().is_none(), + "failed initialize must not persist token" + ); + assert!( + client.get_admin().is_none(), + "failed initialize must not persist admin" + ); +} + +/// Backward-compat: current initialize(token, admin) arity remains the deploy entrypoint. +#[test] +fn test_initialize_deploy_invariant_token_admin_signature() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +#[test] +fn test_referral_clears_on_resubscribe_with_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_self_referral_rejected_via_try_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(user.clone()), + ); + + assert_eq!(result, Err(Ok(soroban_sdk::Error::from_contract_error(11)))); +} + +// ───────────────────────────────────────────── +// Issue #97: migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_sets_schema_version() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Before migration, version defaults to 0 + assert_eq!(client.get_schema_version(), 0); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +fn test_migrate_is_idempotent() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + client.migrate(&empty_users); // second call should be a no-op + + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────── +#[test] +#[should_panic] +fn test_migrate_non_admin_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); +} + +#[test] +fn test_migrate_emits_completed_event_with_version_and_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (version, user_count): (u32, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "migration_completed")); + assert_eq!(version, 3); + assert_eq!(user_count, 1); +} + +// ───────────────────────────────────────────── +// Issue #99: subscription metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_set_and_get_metadata() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +fn test_clear_metadata_removes_label() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + assert_eq!(client.get_metadata(&user), Some(label)); + + client.clear_metadata(&user); + + assert!(client.get_metadata(&user).is_none()); +} + +#[test] +fn test_get_metadata_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.get_metadata(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Issue #98: charge history tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_charge_history_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. A fresh user with no subscription/no charges ever → count is 0. + let fresh_user = Address::generate(&env); + assert_eq!(client.get_charge_history_count(&fresh_user), 0); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Also checking count for user with active subscription but no charges yet + assert_eq!(client.get_charge_history_count(&user), 0); + + // 2. Count increments by 1 correctly after each individual charge event. + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 1); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 2); + + // Charge more to get exactly 12 entries + for _ in 0..10 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + // 5. (Edge case) A user with exactly 12 entries → returns exactly 12. + assert_eq!(client.get_charge_history_count(&user), 12); + + // 3. Count caps at 12 and does not exceed it even after more than 12 charges have occurred. + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + assert_eq!(client.get_charge_history_count(&user), 12); + + // 4. After calling clear_charge_history for a user who had history, count returns to 0. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.clear_charge_history(&user); + assert_eq!(client.get_charge_history_count(&user), 0); +} + +#[test] +fn test_charge_history_recorded() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_charge_history(&user).len(), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); +} + +#[test] +fn test_charge_history_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Perform 14 charges + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + assert_eq!(client.get_charge_history(&user).len(), 12); +} + +#[test] +fn test_get_charge_history_three_charges_ascending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let history = client.get_charge_history(&user); + assert_eq!(history.len(), 3); + assert_eq!(history.get(0).unwrap(), t1); + assert_eq!(history.get(1).unwrap(), t2); + assert_eq!(history.get(2).unwrap(), t3); +} + +#[test] +fn test_get_charge_history_page_offset_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let page = client.get_charge_history_page(&user, &1u32, &2u32, &true); + assert_eq!(page.len(), 2); + assert_eq!(page.get(0).unwrap(), t2); + assert_eq!(page.get(1).unwrap(), t3); +} + +#[test] +#[should_panic] +fn test_clear_charge_history_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + client.clear_charge_history(&user); +} + +#[test] +fn test_clear_charge_history_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); + + client.clear_charge_history(&user); + + assert_eq!(client.get_charge_history(&user).len(), 0); +} + +#[test] +fn test_get_charge_history_empty_for_no_history() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + let history = client.get_charge_history(&random); + assert_eq!(history.len(), 0); +} + +#[test] +fn test_get_charge_history_page_limit_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + let page = client.get_charge_history_page(&user, &0u32, &100u32, &true); + assert_eq!(page.len(), 12); +} + +#[test] +fn test_get_charge_history_page_offset_beyond_length() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let page = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(page.len(), 0); +} + +#[test] +fn test_charge_history_sort_ascending_and_descending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut timestamps = Vec::new(&env); + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + timestamps.push_back(env.ledger().timestamp()); + } + + let t0 = timestamps.get(0).unwrap(); + let t1 = timestamps.get(1).unwrap(); + let t2 = timestamps.get(2).unwrap(); + let t3 = timestamps.get(3).unwrap(); + let t4 = timestamps.get(4).unwrap(); + + // Ascending (true) full page: [t0, t1, t2, t3, t4] + let asc_all = client.get_charge_history_page(&user, &0u32, &10u32, &true); + assert_eq!(asc_all.len(), 5); + assert_eq!(asc_all.get(0).unwrap(), t0); + assert_eq!(asc_all.get(1).unwrap(), t1); + assert_eq!(asc_all.get(2).unwrap(), t2); + assert_eq!(asc_all.get(3).unwrap(), t3); + assert_eq!(asc_all.get(4).unwrap(), t4); + + // Descending (false) full page: [t4, t3, t2, t1, t0] + let desc_all = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(desc_all.len(), 5); + assert_eq!(desc_all.get(0).unwrap(), t4); + assert_eq!(desc_all.get(1).unwrap(), t3); + assert_eq!(desc_all.get(2).unwrap(), t2); + assert_eq!(desc_all.get(3).unwrap(), t1); + assert_eq!(desc_all.get(4).unwrap(), t0); + + // Pagination in ascending direction: + let asc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &true); + assert_eq!(asc_p1.len(), 2); + assert_eq!(asc_p1.get(0).unwrap(), t0); + assert_eq!(asc_p1.get(1).unwrap(), t1); + + let asc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &true); + assert_eq!(asc_p2.len(), 2); + assert_eq!(asc_p2.get(0).unwrap(), t2); + assert_eq!(asc_p2.get(1).unwrap(), t3); + + let asc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &true); + assert_eq!(asc_p3.len(), 1); + assert_eq!(asc_p3.get(0).unwrap(), t4); + + let asc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(asc_p4.len(), 0); + + // Pagination in descending direction: + let desc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &false); + assert_eq!(desc_p1.len(), 2); + assert_eq!(desc_p1.get(0).unwrap(), t4); + assert_eq!(desc_p1.get(1).unwrap(), t3); + + let desc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &false); + assert_eq!(desc_p2.len(), 2); + assert_eq!(desc_p2.get(0).unwrap(), t2); + assert_eq!(desc_p2.get(1).unwrap(), t1); + + let desc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &false); + assert_eq!(desc_p3.len(), 1); + assert_eq!(desc_p3.get(0).unwrap(), t0); + + let desc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &false); + assert_eq!(desc_p4.len(), 0); +} + +#[test] +fn test_charge_history_sort_edge_cases() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + // Empty history + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &true) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &false) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &5u32, &10u32, &false) + .len(), + 0 + ); + + // Single entry + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t0 = env.ledger().timestamp(); + + let asc_single = client.get_charge_history_page(&user, &0u32, &10u32, &true); + let desc_single = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(asc_single.len(), 1); + assert_eq!(desc_single.len(), 1); + assert_eq!(asc_single.get(0).unwrap(), t0); + assert_eq!(desc_single.get(0).unwrap(), t0); +} + +#[test] +fn test_clear_charge_history_nonexistent_key_no_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.clear_charge_history(&random); +} + +// ───────────────────────────────────────────── +// contract_health_check tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_initialized_unpaused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!( + report.is_healthy, + "initialized and unpaused contract should be healthy" + ); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +#[test] +fn test_health_check_paused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy, "paused contract should not be healthy"); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_pre_initialize() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!( + !report.token_configured, + "token should not be configured before initialize" + ); + assert!( + !report.is_healthy, + "uninitialized contract should not be healthy" + ); +} + +#[test] +fn test_health_check_active_subscription_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let report = client.contract_health_check(); + assert_eq!(report.active_subscription_count, 1); +} + +// ───────────────────────────────────────────── +// Issue 010: HealthReport field cleanup tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_healthy_fully_configured() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!(report.is_healthy); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); + assert!(report.instance_ttl_ledgers > 0); + // pending_merchant_rev_count is 0 when no merchants have revenue + assert_eq!(report.pending_merchant_rev_count, 0); +} + +#[test] +fn test_health_check_paused_not_healthy() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_unconfigured_not_healthy() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(!report.token_configured); + assert!(!report.admin_configured); +} + +/// Verify that TTL is reported as a positive value (test builds use real get_ttl). +#[test] +fn test_health_check_ttl_is_positive() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + assert!( + report.instance_ttl_ledgers > 0, + "instance_ttl_ledgers should be positive in test builds" + ); +} + +#[test] +fn test_ttl_extension() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // We can't easily assert the exact TTL in the test environment without more complex mock_all_auths + // or internal access, but we can verify the function exists and doesn't panic. + + // Keep the contract instance itself alive across the jump below — only the + // Subscription entry's TTL is extended by extend_subscription_ttl, but the + // contract instance needs its own TTL or the whole contract becomes archived. + // Extend a bit past SUBSCRIPTION_TTL_LEDGERS to cover the two ledger jumps below. + env.as_contract(&contract_id, || { + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS + 10, SUBSCRIPTION_TTL_LEDGERS + 10); + }); + + env.ledger().with_mut(|l| { + l.sequence_number += SUBSCRIPTION_TTL_LEDGERS - 1; + }); + + client.extend_subscription_ttl(&user); + + assert!(client.get_subscription(&user).is_some()); +} + +// ───────────────────────────────────────────── +// Issue 013: PauseExpiry TTL coupled with subscription bump +// ───────────────────────────────────────────── + +#[test] +fn test_bump_subscription_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Verify PauseExpiry exists before bump + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should exist after pause_until"); + }); + + // Bump subscription TTL — should also bump PauseExpiry + client.bump_subscription(&user); + + // PauseExpiry should still exist (not archived) + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive bump_subscription"); + assert_eq!(expiry.unwrap(), 90000); + }); +} + +#[test] +fn test_bump_subscription_no_op_on_absent_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // No PauseExpiry — bump should be a safe no-op + client.bump_subscription(&user); + + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(expiry, None, "PauseExpiry should remain absent"); + }); +} + +#[test] +fn test_batch_extend_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &200000); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // PauseExpiry should survive batch extend + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive batch_extend"); + assert_eq!(expiry.unwrap(), 200000); + }); +} + +#[test] +fn test_pause_then_batch_extend_then_auto_resume() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Batch extend keeps PauseExpiry alive + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // Advance to expiry — auto-resume should still work + env.ledger().set_timestamp(90000); + let mut users2 = soroban_sdk::Vec::new(&env); + users2.push_back(user.clone()); + let result = client.batch_charge(&users2); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); +} + +// ───────────────────────────────────────────── +// CONTRACT-22: bump_instance_ttl tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_extends_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS / 2); +} + +#[test] +fn test_initialize_sets_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin); + let admin = Address::generate(&env); + + client.initialize(&token_id.address(), &admin); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl > 0); +} + +#[test] +fn test_bump_instance_ttl_is_permissionless_and_state_preserving() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + env.ledger().with_mut(|ledger| { + ledger.max_entry_ttl = SUBSCRIPTION_TTL_LEDGERS * 2; + }); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let admin_before = client.get_admin(); + let token_before = client.get_token(); + let fee_before = client.get_fee(); + let subscription_before = client.get_subscription(&user); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += SUBSCRIPTION_TTL_LEDGERS / 2 + 100; + }); + let ttl_before = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + + env.set_auths(&[]); + client.bump_instance_ttl(); + + let ttl_after = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl_after > ttl_before); + assert!(ttl_after >= SUBSCRIPTION_TTL_LEDGERS); + assert_eq!(client.get_admin(), admin_before); + assert_eq!(client.get_token(), token_before); + assert_eq!(client.get_fee(), fee_before); + assert_eq!(client.get_subscription(&user), subscription_before); + + client.bump_instance_ttl(); + let repeated_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(repeated_ttl >= ttl_after); +} + +#[test] +#[should_panic] +fn test_subscribe_interval_under_60_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +fn test_subscribe_interval_minimum_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +#[test] +#[should_panic(expected = "Error(Contract, #15)")] +fn test_subscribe_amount_above_cap_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &(MAX_SUBSCRIPTION_AMOUNT + 1)); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &(MAX_SUBSCRIPTION_AMOUNT + 1), &200); + + client.subscribe( + &user, + &merchant, + &(MAX_SUBSCRIPTION_AMOUNT + 1), + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_amount_at_cap_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &MAX_SUBSCRIPTION_AMOUNT); + let token = soroban_sdk::token::Client::new(&env, &token_addr); + token.approve(&user, &contract_id, &MAX_SUBSCRIPTION_AMOUNT, &200); + + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, MAX_SUBSCRIPTION_AMOUNT); +} + +// ───────────────────────────────────────────── +// Admin transfer tests +// ───────────────────────────────────────────── + +#[test] +fn test_transfer_admin() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + // Step 1: propose + client.transfer_admin(&new_admin); + // Step 2: accept + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_transfer_admin_event_emitted() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_old_admin, emitted_new_admin): (Address, Address) = + data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "admin_transferred")); + assert_eq!(emitted_old_admin, old_admin); + assert_eq!(emitted_new_admin, new_admin); +} + +#[test] +fn test_transfer_admin_requires_auth() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_old_admin_loses_access_after_transfer() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_ne!(current_admin, old_admin); +} + +#[test] +#[should_panic] +fn test_accept_admin_without_proposal_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.accept_admin(); +} + +#[test] +fn test_initialize_without_valid_token() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + // Using a user address instead of a token contract address. + // The contract currently does not validate if the address is a valid token contract + // or even if it's a contract at all. + let invalid_token = Address::generate(&env); + let admin = Address::generate(&env); + + client.initialize(&invalid_token, &admin); + + // Success means it didn't panic, which is the current expected behavior. +} + +// ───────────────────────────────────────────── +// Global volume cap tests +// ───────────────────────────────────────────── + +/// Helper: set up a user with a large balance for global volume testing +fn setup_large_balance(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &100_000_000_000_000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &100_000_000_000_000, &200000); + user +} + +#[test] +fn test_global_volume_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; // well under limit + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + // Should succeed - well under the 50 trillion stroops limit +} + +#[test] +#[should_panic] +fn test_global_volume_exceeds_limit() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Give users large balances to exceed the 50_000_000_000_000 limit + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 30_000_000_000_000; // 30 trillion stroops each + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // First charge succeeds (30 trillion used) + client.charge(&user_a); + + // Second charge should panic (60 trillion total > 50 trillion limit) + client.charge(&user_b); +} + +#[test] +fn test_global_volume_window_reset() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; // well under MAX_AMOUNT + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); // 5 trillion used this window + + // Advance time past the 1-hour window boundary (3601 seconds) + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + + // This charge should succeed because the window has reset + client.charge(&user_b); +} + +// ───────────────────────────────────────────── +// Issue #10: get_global_volume_window tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_global_volume_window_returns_zero_on_fresh_contract() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, 0, "accumulated volume should be 0 on fresh contract"); + assert_eq!(window_start, 0, "window start should be 0 on fresh contract"); +} + +#[test] +fn test_get_global_volume_window_correct_values_after_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let charge_time = env.ledger().timestamp(); + client.charge(&user); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, amount, "accumulated volume should equal the charged amount"); + assert_eq!(window_start, charge_time, "window_start should equal ledger timestamp at charge time"); +} + +#[test] +fn test_get_global_volume_window_resets_after_hour() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe(&user_a, &merchant, &amount, &interval, &token_addr, &None, &None); + client.subscribe(&user_b, &merchant, &amount, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); + + // Confirm volume accumulated in the first window + let (volume_before, _) = client.get_global_volume_window(); + assert_eq!(volume_before, amount); + + // Advance past the 1-hour window boundary + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + let second_charge_time = env.ledger().timestamp(); + client.charge(&user_b); + + // Window should have reset: only the second charge amount is accumulated + let (volume_after, window_start_after) = client.get_global_volume_window(); + assert_eq!(volume_after, amount, "volume should reset to just the new charge amount after window expiry"); + assert_eq!(window_start_after, second_charge_time, "window_start should be the new charge time after reset"); +} + + + +// ───────────────────────────────────────────── +// subscribe_with_metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_with_metadata_success() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let label = soroban_sdk::String::from_str(&env, "Pro Plan"); + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &label, + ); + + // Verify subscription is created + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + + // Verify metadata is set + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_label_too_long() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create a 65-byte label (exceeds 64-byte limit) + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", // 65 chars + ); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Should panic with MetadataLabelTooLong + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &long_label, + ); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_no_subscription_on_label_failure() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", + ); + + // Label validation happens before subscribe_inner, so no subscription should be written. + // This panics before any storage write — we verify that by catching the panic separately + // in test_subscribe_with_metadata_label_too_long. Here we just assert the panic occurs. + client.subscribe_with_metadata( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + &long_label, + ); +} + +// ───────────────────────────────────────────── +// get_protocol_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_protocol_stats_initial() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let stats = client.get_protocol_stats(); + + assert_eq!(stats.active_count, 0); + assert_eq!(stats.fee_bps, 0); + assert!(stats.fee_collector.is_none()); + assert_eq!(stats.grace_period, 0); + assert!(!stats.whitelist_enabled); + assert_eq!(stats.schema_version, 0); // default unmigrated version + assert!(!stats.contract_paused); +} + +#[test] +fn test_get_protocol_stats_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.active_count, 1); +} + +#[test] +fn test_get_protocol_stats_with_fee() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + let fee_collector = Address::generate(&env); + client.propose_fee(&fee_collector, &100); // 1% fee + client.commit_fee(); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.fee_bps, 100); + assert_eq!(stats.fee_collector, Some(fee_collector)); +} + +#[test] +fn test_get_protocol_stats_contract_paused() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + client.pause_contract(); + + let stats = client.get_protocol_stats(); + assert!(stats.contract_paused); + + client.unpause_contract(); + let stats_after = client.get_protocol_stats(); + assert!(!stats_after.contract_paused); +} + +#[test] +fn test_resubscribe() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + // Initial subscription + client.subscribe( + &user, + &merchant_a, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sub1 = client.get_subscription(&user).unwrap(); + assert_eq!(sub1.merchant, merchant_a); + assert_eq!(sub1.amount, 1_0000000); + + // Subscribe again with different parameters + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + let sub2 = client.get_subscription(&user).unwrap(); + + assert_eq!(sub2.merchant, merchant_b); + assert_eq!(sub2.amount, 2_0000000); + assert_eq!(sub2.interval, 172800); + + // Verify old merchant is gone + assert_ne!(sub2.merchant, merchant_a); +} + +#[test] +fn test_subscribe_overwrites_cancelled_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. Cancel + client.cancel(&user); + let sub_cancelled = client.get_subscription(&user).unwrap(); + assert!(!sub_cancelled.active); + + // 3. Subscribe again + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + + // 4. Verify new subscription is active + let sub_new = client.get_subscription(&user).unwrap(); + assert!(sub_new.active); + assert_eq!(sub_new.amount, 2_0000000); +} + +// ───────────────────────────────────────────── +// min_interval tests +// ───────────────────────────────────────────── + +/// get_min_interval returns 3600 (1 hour) before any admin configuration. +#[test] +fn test_get_min_interval_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_min_interval(), 3600); +} + +#[test] +fn test_min_interval_event_emitted_on_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Verify default value is 3600 before setting + assert_eq!(client.get_min_interval(), 3600); + + // First set: old value should be 3600 default, new value 7200 + client.set_min_interval(&7200u64); + assert_eq!(client.get_min_interval(), 7200); + + let events_vec = env.events().all(); + let (_, topics, data) = events_vec.get(events_vec.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "min_interval_set")); + + let event_data: events::MinIntervalSetEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.old, 3600); + assert_eq!(event_data.new, 7200); + + // Second set: old value 7200, new value 86400 + client.set_min_interval(&86400u64); + assert_eq!(client.get_min_interval(), 86400); + + let events_vec2 = env.events().all(); + let (_, topics2, data2) = events_vec2.get(events_vec2.len() - 1).unwrap(); + let topic_symbol2: Symbol = topics2.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol2, Symbol::new(&env, "min_interval_set")); + + let event_data2: events::MinIntervalSetEventData = data2.try_into_val(&env).unwrap(); + assert_eq!(event_data2.old, 7200); + assert_eq!(event_data2.new, 86400); + + // Same value set again: old == 86400, new == 86400 + client.set_min_interval(&86400u64); + let events_vec3 = env.events().all(); + let (_, topics3, data3) = events_vec3.get(events_vec3.len() - 1).unwrap(); + let topic_symbol3: Symbol = topics3.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol3, Symbol::new(&env, "min_interval_set")); + + let event_data3: events::MinIntervalSetEventData = data3.try_into_val(&env).unwrap(); + assert_eq!(event_data3.old, 86400); + assert_eq!(event_data3.new, 86400); +} + +#[test] +fn test_top_merchants_by_subs() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Create subscriptions for m1 (1 sub), m2 (3 subs), m3 (2 subs) + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + let u3 = setup_funded_user(&env, &contract_id, &token_addr); + let u4 = setup_funded_user(&env, &contract_id, &token_addr); + let u5 = setup_funded_user(&env, &contract_id, &token_addr); + let u6 = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u3, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u4, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u5, &m3, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u6, &m3, &1_0000000, &86400, &token_addr, &None, &None); + + // Top 3 merchants: m2 (3 subs), m3 (2 subs), m1 (1 sub) + let top = client.get_top_merchants_by_subs(&3u32); + assert_eq!(top.len(), 3); + assert_eq!(top.get(0).unwrap(), (m2.clone(), 3u32)); + assert_eq!(top.get(1).unwrap(), (m3.clone(), 2u32)); + assert_eq!(top.get(2).unwrap(), (m1.clone(), 1u32)); + + // Unknown / unindexed merchant returns 0 for subscriber count query + let unindexed = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unindexed), 0); +} + +#[test] +fn test_top_merchants_tie_breaking_and_limit() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + + // Add m1 first, then m2 + client.add_merchant(&m1); + client.add_merchant(&m2); + + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + + // Both m1 and m2 get 1 sub (tie) + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + // Tie-breaking preserves index order: m1 first, m2 second + let top = client.get_top_merchants_by_subs(&2u32); + assert_eq!(top.len(), 2); + assert_eq!(top.get(0).unwrap(), (m1.clone(), 1u32)); + assert_eq!(top.get(1).unwrap(), (m2.clone(), 1u32)); + + // Limit 1 returns top 1 + let top1 = client.get_top_merchants_by_subs(&1u32); + assert_eq!(top1.len(), 1); + assert_eq!(top1.get(0).unwrap(), (m1.clone(), 1u32)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_top_merchants_limit_exceeded_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.get_top_merchants_by_subs(&21u32); +} + +/// subscribe panics with IntervalTooShort when interval < default floor of 3600. +#[test] +#[should_panic] +fn test_subscribe_interval_too_short_panics_default_floor() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // 1800 seconds (30 min) < 3600 default floor + client.subscribe( + &user, + &merchant, + &1_0000000, + &1800, + &token_addr, + &None, + &None, + ); +} + +/// Lowering the floor via set_min_interval then subscribing at the new floor succeeds. +#[test] +fn test_subscribe_after_set_min_interval_lower_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&60u64); + + assert_eq!(client.get_min_interval(), 60); + // 60 seconds == new floor — should succeed + client.subscribe(&user, &merchant, &1_0000000, &60, &token_addr, &None, &None); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn prop_subscribe_interval_respects_min_interval_floor() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let default_floor = client.get_min_interval(); + + let mut state = 0x9e3779b97f4a7c15u64; + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % default_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "interval {interval} must be rejected"); + } + + for offset in 0..4 { + let interval = default_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } + + let admin = Address::generate(&env); + client.set_initial_admin(&admin); + let updated_floor = 97u64; + client.set_min_interval(&updated_floor); + assert_eq!(client.get_min_interval(), updated_floor); + + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % updated_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "updated floor rejected interval {interval}"); + } + + for offset in 0..4 { + let interval = updated_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } +} + +/// set_min_interval(0) panics. +#[test] +#[should_panic(expected = "min interval must be positive")] +fn test_set_min_interval_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&0u64); +} + +/// Calling set_min_interval without a configured admin panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_set_min_interval_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics with "admin not set" + client.set_min_interval(&7200u64); +} + +// ───────────────────────────────────────────── +// clear_merchant_revenue_history tests +// ───────────────────────────────────────────── + +/// Admin can clear history; subsequent query returns an empty Vec (zero-length). +/// Clearing does not affect the cumulative revenue total. +#[test] +fn test_clear_merchant_revenue_history_drops_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Produce some history via a charge + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // History should have one entry + let history_before = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_before.len(), 1); + + // Cumulative revenue is present + let revenue = client.get_merchant_revenue(&merchant); + assert!(revenue > 0); + + // Clear history as admin + client.clear_merchant_revenue_history(&merchant); + + // History is now zero-length + let history_after = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_after.len(), 0); + + // Cumulative revenue is untouched + assert_eq!(client.get_merchant_revenue(&merchant), revenue); +} + +/// Clearing history for a merchant with no recorded data is idempotent (does not panic). +#[test] +fn test_clear_merchant_revenue_history_idempotent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let unknown_merchant = Address::generate(&env); + + client.set_initial_admin(&admin); + + // First call — no data exists, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + // Second call — still no data, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + + assert_eq!( + client + .get_merchant_revenue_history(&unknown_merchant, &5u32) + .len(), + 0 + ); +} + +/// Calling clear_merchant_revenue_history without an admin configured panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_clear_merchant_revenue_history_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics + client.clear_merchant_revenue_history(&merchant); +} + +// ───────────────────────────────────────────── +// Subscriber index tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscriber_index_three_unique_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 3); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 3); + assert_eq!(page.get(0).unwrap(), user_a); + assert_eq!(page.get(1).unwrap(), user_b); + assert_eq!(page.get(2).unwrap(), user_c); +} + +#[test] +fn test_get_subscriber_at_returns_first() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_at(&0u64), Some(user)); + assert_eq!(client.get_subscriber_at(&1u64), None); +} + +#[test] +fn test_resubscribe_active_does_not_duplicate_index() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + // Re-subscribe while still active — must not append a second entry + client.subscribe( + &user, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); +} + +#[test] +fn test_subscriber_page_offset_beyond_count_returns_empty() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&1u64, &10u32); + assert_eq!(page.len(), 0); + + let page_zero_limit = client.get_subscriber_page(&0u64, &0u32); + assert_eq!(page_zero_limit.len(), 0); +} + +#[test] +#[cfg(feature = "bench")] +fn test_subscriber_page_limit_capped_at_50() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sac = StellarAssetClient::new(&env, &token_addr); + let token = TokenClient::new(&env, &token_addr); + + for _ in 0..52 { + let sub_user = Address::generate(&env); + sac.mint(&sub_user, &10_000_0000000); + token.approve(&sub_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &sub_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + } + + assert_eq!(client.get_subscriber_count(), 53); + + let page = client.get_subscriber_page(&0u64, &100u32); + assert_eq!(page.len(), 50); +} +// Issue #231: token.rs SAC compatibility test +// ───────────────────────────────────────────── + +/// Test that a custom SAC token (not native XLM) works end-to-end +/// with subscribe, charge, and pay_per_use operations. +#[test] +fn test_custom_sac_token_end_to_end_flow() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Setup a custom SAC token (not the default one from setup()) + let custom_token = setup_second_token(&env, &contract_id, &user); + let token = TokenClient::new(&env, &custom_token); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Step 1: Subscribe with custom SAC token + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &custom_token, + &None, + &None, + ); + + // Verify subscription uses the custom token + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!( + sub.token, custom_token, + "subscription should use custom SAC token" + ); + + // Step 2: Charge after interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + // Verify exact amount transferred + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by subscription amount" + ); + + // Step 3: Pay-per-use with custom SAC token + let user_balance_before_ppu = token.balance(&user); + let merchant_balance_before_ppu = token.balance(&merchant); + + let ppu_amount: i128 = 2_0000000; + client.pay_per_use(&user, &ppu_amount); + + let user_balance_after_ppu = token.balance(&user); + let merchant_balance_after_ppu = token.balance(&merchant); + + // Verify pay-per-use amount transferred + assert_eq!( + user_balance_before_ppu - user_balance_after_ppu, + ppu_amount, + "user balance should decrease by pay_per_use amount" + ); + assert_eq!( + merchant_balance_after_ppu - merchant_balance_before_ppu, + ppu_amount, + "merchant balance should increase by pay_per_use amount" + ); + + // Verify subscription is still active after pay_per_use + let sub_final = client.get_subscription(&user).unwrap(); + assert!( + sub_final.active, + "subscription should remain active after pay_per_use" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #237: get_token() read function tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_token_returns_none_when_not_initialized() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + assert!(client.get_token().is_none()); +} + +#[test] +fn test_get_token_returns_initialized_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +// ───────────────────────────────────────────── +// Issue: get_grace_period getter +// ───────────────────────────────────────────── + +#[test] +fn test_get_grace_period_default_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_grace_period(), 0); +} + +#[test] +fn test_get_grace_period_after_set() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + client.propose_grace_period(&3600); + client.commit_grace_period(); + assert_eq!(client.get_grace_period(), 3600); +} + +// ───────────────────────────────────────────── +// Issue: fee_updated event on set_fee +// ───────────────────────────────────────────── + +#[test] +fn test_set_fee_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_collector, emitted_bps): (Address, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); + assert_eq!(emitted_collector, collector); + assert_eq!(emitted_bps, 100u32); +} + +#[test] +fn test_get_fee_returns_current_fee_settings() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &250); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 250u32))); +} + +#[test] +#[should_panic] +fn test_set_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &10001); + client.commit_fee(); +} + +// ───────────────────────────────────────────── +// Issue: grace_period_updated event on set_grace_period +// ───────────────────────────────────────────── + +#[test] +fn test_set_grace_period_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_grace_period(&7200); + client.commit_grace_period(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let emitted_seconds: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "grace_period_committed")); + assert_eq!(emitted_seconds, 7200u64); +} + +// ───────────────────────────────────────────── +// Issue #195: grace period charge behavior +// ───────────────────────────────────────────── + +#[test] +fn test_charge_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Past billing interval but still inside grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, env.ledger().timestamp()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #9)")] +fn test_charge_after_grace_window_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_non_admin_set_grace_period_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.propose_grace_period(&3600); + client.commit_grace_period(); +} + +// ───────────────────────────────────────────── + +// ------------------------------------------------------------- +// Issue #45: resume/cancel on grace-lapsed subscriptions +// ------------------------------------------------------------- + + +/// resume on a grace-lapsed subscription must panic with ResumeGraceLapsed (#100). +#[test] +#[should_panic(expected = "Error(Contract, #100)")] +fn test_resume_after_grace_lapse_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // resume must be rejected because the grace window has closed + client.resume(&user); +} + +/// cancel on a grace-lapsed subscription must still succeed. +#[test] +fn test_cancel_after_grace_lapse_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // cancel must still be allowed so the user can exit cleanly + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active, "subscription should be inactive after cancel"); +} + +/// resume within a valid (non-lapsed) grace window must succeed normally. +#[test] +fn test_resume_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval but still inside the grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + // resume must succeed because the grace window has not yet closed + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); + assert!(sub.active, "subscription should remain active"); +} + +/// resume when no grace period is configured must succeed regardless of elapsed time. +#[test] +fn test_resume_no_grace_period_always_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No grace period set -- default is 0 + let interval: u64 = 86400; + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance far past the interval -- grace is 0 so lapse check is skipped + env.ledger().with_mut(|l| { + l.timestamp += interval * 10; + }); + + // resume must succeed because grace_period == 0 means no lapse + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); +} + +// Issue #243: Token address validation +// ───────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #12)")] +fn test_subscribe_non_contract_address() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Provide a non-contract address (just an account) + use soroban_sdk::xdr::{AccountId, PublicKey, ScAddress, Uint256}; + use soroban_sdk::TryFromVal; + let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0; 32]))); + let non_contract_token = Address::try_from_val(&env, &ScAddress::Account(account_id)).unwrap(); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &non_contract_token, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_valid_sac_token_address_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_addr); +} + +// Issue #232: charge() insufficient-allowance error path +// ───────────────────────────────────────────── + +/// If a user's token allowance drops below `sub.amount` between subscribe and +/// charge time, `transfer_from` must fail and propagate the error. +#[test] +#[should_panic] +fn test_charge_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Subscribe with sufficient allowance + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Revoke allowance — set it to 0 + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &200); + + // Advance ledger past the interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // charge() should panic because transfer_from fails with insufficient allowance + client.charge(&user); +} + +#[test] +fn test_set_metadata_label_at_limit_succeeds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let valid_label = soroban_sdk::String::from_str( + &env, + "this_is_a_perfectly_valid_sixty_four_character_metadata_label_ok", + ); + assert_eq!(valid_label.len(), 64); + + client.set_metadata(&user, &valid_label); + + assert_eq!(client.get_metadata(&user), Some(valid_label)); +} + +#[test] +#[should_panic] +fn test_set_metadata_label_exceeding_limit_fails() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let invalid_label = soroban_sdk::String::from_str( + &env, + "this_is_an_invalid_sixty_five_character_metadata_label_too_long_!", + ); + assert_eq!(invalid_label.len(), 65); + + client.set_metadata(&user, &invalid_label); +} +// ───────────────────────────────────────────── +// Issue #469: set_subscription_label auth and alias tests +// ───────────────────────────────────────────── +#[test] +fn test_set_metadata_wrong_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let attacker = Address::generate(&env); + let label = soroban_sdk::String::from_str(&env, "hacked"); + client.set_metadata(&attacker, &label); +} + +#[test] +fn test_get_subscription_label_returns_set_value() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let label = soroban_sdk::String::from_str(&env, "premium"); + client.set_metadata(&user, &label); + assert_eq!(client.get_subscription_label(&user), Some(label)); +} + +#[test] +fn test_get_subscription_label_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + assert!(client.get_subscription_label(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Tests for pause() and resume() +// ───────────────────────────────────────────── + +#[test] +fn test_pause_sets_paused_true() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.paused); +} + +#[test] +#[should_panic] +fn test_charge_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_pay_per_use_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + client.pay_per_use(&user, &1_0000000); +} + +#[test] +fn test_resume_unpauses_and_charge_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + client.resume(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.last_charged > 0); +} + +#[test] +#[should_panic] +fn test_pause_on_inactive_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pause(&user); +} + +// ───────────────────────────────────────────── +// Tests for next_charge_at() +// ───────────────────────────────────────────── + +#[test] +fn test_next_charge_at_returns_correct_timestamp() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + let expected = sub.last_charged + sub.interval; + let got = client.next_charge_at(&user).unwrap(); + assert_eq!(got, expected); +} + +#[test] +fn test_next_charge_at_none_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_next_charge_at_none_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.next_charge_at(&random).is_none()); +} + +#[test] +fn test_transfer_subscription_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + assert!( + client.get_subscription(&user).is_none(), + "old subscription should be removed" + ); + + let new_sub = client.get_subscription(&new_user).unwrap(); + assert!(new_sub.active, "new subscription should be active"); + assert_eq!(new_sub.merchant, merchant); + assert_eq!(new_sub.amount, 1_0000000); + assert_eq!(client.get_subscriber_count(), 2); + assert_eq!(client.get_subscriber_at(&0u64), None); + assert_eq!(client.get_subscriber_at(&1u64), Some(new_user)); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_transfer_subscription_to_inactive_user_reuses_tombstone_membership() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let new_user = setup_funded_user(&env, &contract_id, &token_addr); + let inactive_merchant = Address::generate(&env); + + client.subscribe( + &new_user, + &inactive_merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&new_user); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); + + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + assert_eq!(client.get_merchant_sub_count(&inactive_merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); + assert_eq!(page.get(0).unwrap(), new_user); +} + +#[test] +fn test_transfer_subscription_event_emitted() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + let mut seen_transfer_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "subscription_transferred") { + let topic_from: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let topic_to: Address = topics.get(2).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_from, user); + assert_eq!(topic_to, new_user); + + let event_payload: (Address, i128, u64, Address) = data.try_into_val(&env).unwrap(); + assert_eq!(event_payload.0, merchant); + assert_eq!(event_payload.1, 1_0000000); + assert_eq!(event_payload.2, 86400); + assert_eq!(event_payload.3, token_addr); + seen_transfer_event = true; + } + } + + assert!( + seen_transfer_event, + "expected a subscription_transferred event" + ); +} + +#[test] +#[should_panic] +fn test_transfer_subscription_to_active_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &new_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); +} +// ───────────────────────────────────────────── +// CONTRACT-08: Allowance pre-validation tests +// ───────────────────────────────────────────── + +/// subscribe() with zero allowance must panic with InsufficientAllowance +/// and must NOT write the subscription to storage. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_subscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Deliberately grant zero allowance — no approve() call. + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// After a zero-allowance subscribe() panic, get_subscription() must return None, +/// confirming no storage was written. +/// Note: In the Soroban test environment, panics abort the entire transaction, +/// so storage changes from the failed call are never committed. We verify this +/// by reading storage directly inside the contract after a successful (non-panicking) +/// path: a user who was never subscribed must always return None. +#[test] +fn test_subscribe_zero_allowance_does_not_write_storage() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + let user = Address::generate(&env); + + // Never approved any allowance — a subscribe call would panic. + // Soroban transactions are atomic: a panic reverts all storage writes. + // We confirm the storage slot starts empty (None) and — since we cannot + // call subscribe without panicking — we verify the invariant holds: a + // user address that has never successfully subscribed always returns None. + let client = FlowPayClient::new(&env, &contract_id); + assert!( + client.get_subscription(&user).is_none(), + "subscription must not be stored for a user who has never successfully subscribed" + ); +} + +/// subscribe() with allowance exactly equal to amount must succeed. +#[test] +fn test_subscribe_exact_allowance_succeeds() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 5_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Approve exactly amount — no more, no less. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &amount, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active, "subscription should be active"); + assert_eq!(sub.amount, amount); +} + +/// Re-subscribe (overwriting a cancelled subscription) with zero allowance +/// must also panic with InsufficientAllowance. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_resubscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 1_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // First subscribe with sufficient allowance. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.cancel(&user); + + // Revoke allowance so second subscribe sees zero. + token.approve(&user, &contract_id, &0, &200); + + // Re-subscribe must panic because allowance is zero. + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); +} + +// ───────────────────────────────────────────── +// CONTRACT-36: set_subscription_amount tests +// ───────────────────────────────────────────── + +/// Admin successfully updates a subscription amount; get_subscription reflects +/// the new value and last_charged / interval are untouched. +#[test] +fn test_set_subscription_amount_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let original_amount: i128 = 1_0000000; + let new_amount: i128 = 3_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &original_amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.amount, original_amount); + let last_charged_before = sub_before.last_charged; + + client.set_subscription_amount(&user, &new_amount); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!(sub_after.amount, new_amount, "amount should be updated"); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.interval, interval, "interval must not change"); + assert!(sub_after.active, "subscription should remain active"); +} + +/// Updating a non-existent subscription must panic with NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_amount_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_amount(&random, &2_0000000); +} + +/// A non-admin caller must not be able to update a subscription amount. +#[test] +#[should_panic] +fn test_set_subscription_amount_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Remove all authorizations so the admin auth check fails. + env.set_auths(&[]); + + client.set_subscription_amount(&user, &2_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-37: set_subscription_interval tests +// ───────────────────────────────────────────── + +/// Admin successfully updates the billing interval; next_charge_at reflects the +/// new value and last_charged / amount are untouched. +#[test] +fn test_set_subscription_interval_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let amount: i128 = 1_0000000; + let original_interval: u64 = 86400; // 1 day + let new_interval: u64 = 30 * 24 * 3600; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &original_interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.interval, original_interval); + let last_charged_before = sub_before.last_charged; + let amount_before = sub_before.amount; + + client.set_subscription_interval(&user, &new_interval); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.interval, new_interval, + "interval should be updated" + ); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.amount, amount_before, "amount must not change"); + assert!(sub_after.active, "subscription should remain active"); + + // next_charge_at must reflect last_charged + new_interval + let expected_next = last_charged_before + new_interval; + assert_eq!( + client.next_charge_at(&user).unwrap(), + expected_next, + "next_charge_at should use the updated interval" + ); +} + +/// Setting an interval of zero must panic with IntervalMustBePositive. +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_set_subscription_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_interval(&user, &0); +} + +/// Updating the interval for a non-existent subscription must panic with +/// NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_interval_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_interval(&random, &86400); +} + +/// A non-admin caller must not be able to update the billing interval. +#[test] +#[should_panic] +fn test_set_subscription_interval_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.set_auths(&[]); + + client.set_subscription_interval(&user, &172800); +} + +// ───────────────────────────────────────────── +// CONTRACT-38: withdraw_merchant_revenue tests +// ───────────────────────────────────────────── + +/// Merchant with accrued revenue can withdraw the full tracked balance. +/// After withdrawal: token balance increases by the tracked amount and the +/// revenue counter resets to zero. +#[test] +fn test_withdraw_merchant_revenue_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + // Initialize the global token so withdraw can resolve it. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // The tracked revenue equals the net charge (no fee configured in setup). + let tracked = client.get_merchant_revenue(&merchant); + assert!(tracked > 0, "revenue should be positive after charge"); + + // Seed the contract with enough tokens to cover the withdrawal. + // In a pooling model the contract would accumulate these from charges + // routed through it; here we simulate that by minting directly. + sac.mint(&contract_id, &tracked); + + let merchant_balance_before = token.balance(&merchant); + + client.withdraw_merchant_revenue(&merchant); + + // Revenue counter must be reset to zero. + assert_eq!( + client.get_merchant_revenue(&merchant), + 0, + "revenue counter must be reset after withdrawal" + ); + + // Merchant token balance must increase by the tracked amount. + let merchant_balance_after = token.balance(&merchant); + assert_eq!( + merchant_balance_after - merchant_balance_before, + tracked, + "merchant token balance should increase by the withdrawn amount" + ); +} + +/// Withdrawal with no accrued balance must panic with ZeroBalanceAvailable. +#[test] +#[should_panic(expected = "Error(Contract, #21)")] +fn test_withdraw_merchant_revenue_zero_balance_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + // No charges have occurred, so revenue is zero. + client.withdraw_merchant_revenue(&merchant); +} + +#[test] +fn test_next_charge_at_none_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_is_charge_due_transitions_after_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Before interval elapses: not due + assert!(!client.is_charge_due(&user)); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + assert!(client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + assert!(!client.is_charge_due(&user)); +} + +// ───────────────────────────────────────────── +// ───────────────────────────────────────────── +// CONTRACT-53: batch_pause_subscriptions tests +// ───────────────────────────────────────────── + +/// Admin can pause multiple valid subscriptions in a single batch call. +/// The test verifies paused flag is set, events are emitted, and already-paused +/// or missing addresses are handled without disruption. +#[test] +fn test_batch_pause_subscriptions_mixed_inputs() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Set up user_b with a subscription + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + // Set up user_c with a subscription (will be paused first) + let user_c = Address::generate(&env); + sac.mint(&user_c, &10_000_0000000); + token.approve(&user_c, &contract_id, &10_000_0000000, &200); + + // Set up user_d with a subscription (valid, will be paused in batch) + let user_d = Address::generate(&env); + sac.mint(&user_d, &10_000_0000000); + token.approve(&user_d, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_d, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Pre-pause user_c + client.pause(&user_c); + let sub_c_before = client.get_subscription(&user_c).unwrap(); + assert!(sub_c_before.paused); + + // Verify all others start unpaused + assert!(!client.get_subscription(&user_a).unwrap().paused); + assert!(!client.get_subscription(&user_b).unwrap().paused); + assert!(!client.get_subscription(&user_d).unwrap().paused); + + // Build batch with mixed inputs: valid, missing, already-paused, valid + let no_sub_user = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); // valid → should be paused + users.push_back(no_sub_user.clone()); // no subscription → skipped + users.push_back(user_c.clone()); // already paused → no-op + users.push_back(user_b.clone()); // valid → should be paused + users.push_back(user_d.clone()); // valid → should be paused + + let events_before = env.events().all().len(); + + client.batch_pause_subscriptions(&users); + + // All valid subscriptions must be paused + let sub_a = client.get_subscription(&user_a).unwrap(); + assert!(sub_a.paused, "user_a should be paused"); + + let sub_b = client.get_subscription(&user_b).unwrap(); + assert!(sub_b.paused, "user_b should be paused"); + + let sub_d = client.get_subscription(&user_d).unwrap(); + assert!(sub_d.paused, "user_d should be paused"); + + // Already-paused user_c remains paused + let sub_c = client.get_subscription(&user_c).unwrap(); + assert!(sub_c.paused, "user_c should remain paused"); + + // No subscription was created for no_sub_user + assert!( + client.get_subscription(&no_sub_user).is_none(), + "no_sub_user should have no subscription" + ); + + // Verify events: three subscription_paused events (user_a, user_b, user_d) + let events_after = env.events().all(); + let paused_event_count = (events_before..events_after.len()) + .filter(|&i| { + let (_, topics, _) = events_after.get(i).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + topic_symbol == Symbol::new(&env, "subscription_paused") + }) + .count(); + assert_eq!( + paused_event_count, 3, + "should emit 3 subscription_paused events" + ); +} + +/// Non-admin callers must be rejected with an auth panic. +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Clear all auths — admin auth should fail and panic + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_pause_subscriptions(&users); +} + +/// Batch size exceeding 25 must panic with BatchTooLarge. +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Build a vector with 26 entries + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_admin_batch_cancel_subscriptions_cancels_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 2); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); +} + +#[test] +fn test_batch_cancel_matches_single_cancel_side_effects() { + let (env, contract_id, token_addr, user_single, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_batch = setup_funded_user(&env, &contract_id, &token_addr); + let referrer = Address::generate(&env); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user_single, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_batch, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer), + ); + + client.cancel(&user_single); + let mut users = Vec::new(&env); + users.push_back(user_batch.clone()); + let results = client.batch_cancel(&users); + + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!( + client.get_subscription(&user_single), + client.get_subscription(&user_batch) + ); + assert_eq!(client.get_referrer(&user_single), None); + assert_eq!(client.get_referrer(&user_batch), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 2); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert_eq!(count_user_events(&env, "cancelled", &user_single), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_batch), 1); +} + +#[test] +#[should_panic] +fn test_batch_cancel_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_cancel(&users); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_cancel_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_cancel(&users); +} + +#[test] +fn test_batch_cancel_at_max_size_succeeds() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..25 { + users.push_back(Address::generate(&env)); + } + + let results = client.batch_cancel(&users); + assert_eq!(results.len(), 25); + for result in results.iter() { + assert_eq!(result, CancelResult::NoSubscription); + } +} + +#[test] +fn test_batch_cancel_handles_mixed_states_and_clears_referral() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + let referrer = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user_c); + + assert_eq!(client.get_referrer(&user_a), Some(referrer)); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + users.push_back(user_c.clone()); + users.push_back(missing_user.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(2).unwrap(), CancelResult::AlreadyCancelled); + assert_eq!(results.get(3).unwrap(), CancelResult::NoSubscription); + + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert!(!client.get_subscription(&user_c).unwrap().active); + assert!(client.get_subscription(&missing_user).is_none()); + + assert_eq!(client.get_referrer(&user_a), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert!(client.get_subscriber_at(&2).is_none()); + + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_c), 1); +} + +// ───────────────────────────────────────────── +// CONTRACT-07: get_merchant_sub_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_sub_count_two_users_cancel_one() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 2); + + client.cancel(&user_a); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_merchant_sub_count_resubscribe_different_merchant() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Subscribe user to merchant A + client.subscribe( + &user, + &merchant_a, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 1); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 0); + + // Re-subscribe user to merchant B + client.subscribe( + &user, + &merchant_b, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 0); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 1); +} + +#[test] +fn test_merchant_sub_count_never_subscribed_returns_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown_merchant = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unknown_merchant), 0); +} + +#[test] +fn test_merchant_sub_count_double_cancel_no_underflow() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + + // Second cancel must not underflow + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); +} + +#[test] +fn test_is_charge_due_false_past_grace_window() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let interval: u64 = 86400; + let grace: u64 = 3600; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.propose_grace_period(&grace); + client.commit_grace_period(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace + 1; + }); + + assert!(!client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(!client.is_charge_due(&Address::generate(&env))); +} + +#[test] +fn test_daily_limit_day_start_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Spend 10 more + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 20_0000000); + + // Manually extend DailyLimit (and other entries touched by the upcoming pay_per_use) + // TTL so they survive the time skip below. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + // 35,000 ledgers > LEDGERS_PER_DAY (17,280) + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance sequence by LEDGERS_PER_DAY + 1 to expire DayStart (17,280 + 1 = 17,281) + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance, which expired when the ledger sequence jumped past it + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // New spend on new day + client.pay_per_use(&user, &15_0000000); + + // Should only be 15, not 35 + assert_eq!(client.get_daily_spent(&user), 15_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-821: simulate_pay_per_use dry-run helper +// ───────────────────────────────────────────── + +/// The sibling dry-run of `pay_per_use` returns distinct outcomes for the +/// inactive, paused, would-succeed, and daily-limit cases, while performing no +/// state writes. +#[test] +fn test_simulate_pay_per_use_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::Inactive + ); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. WouldSucceed when active, no daily limit, allowance sufficient + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + + // 3. DailyLimitExceeded when the limit would be exceeded + client.set_daily_limit(&user, &5_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &6_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 4. DailyLimitExceeded on cumulative spend: 3, then simulate another 3 (>5) + client.pay_per_use(&user, &3_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &3_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 5. SubscriptionPaused when paused + let before_spent = client.get_daily_spent(&user); + client.pause(&user); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::SubscriptionPaused + ); + client.resume(&user); + + // 6. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::InsufficientAllowance + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::ContractPaused + ); + + // No simulation wrote to daily spend tracking. + assert_eq!(client.get_daily_spent(&user), before_spent); +} + +/// `simulate_pay_per_use` performs no state writes: daily spent, day start, and +/// balance are unchanged regardless of the simulated outcome. +#[test] +fn test_simulate_pay_per_use_no_state_writes() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + + client.pay_per_use(&user, &2_0000000); + + let spent_before = client.get_daily_spent(&user); + let day_start_before = client.get_day_start(&user); + let balance_before = TokenClient::new(&env, &token_addr) + .balance(&user); + + // Would succeed + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + // Limit exceeded + assert_eq!( + client.simulate_pay_per_use(&user, &5_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + assert_eq!(client.get_daily_spent(&user), spent_before); + assert_eq!(client.get_day_start(&user), day_start_before); + assert_eq!( + TokenClient::new(&env, &token_addr).balance(&user), + balance_before + ); +} + +/// Simulating a spend at a day-window boundary reflects the fresh (reset) daily +/// spent value after the window has elapsed, mirroring `pay_per_use`. +#[test] +fn test_simulate_pay_per_use_day_window_reset_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 today. + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Crossing the day boundary makes the reset daily spent visible to the + // dry-run: today a 45 spend would exceed (10 + 45 > 50)... + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // Manually extend the DailyLimit (and merchant-revenue) TTL so they survive + // the time skip below, while intentionally leaving DailySpent/DayStart to + // expire so the new window starts from a reset counter. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance past the day window (LEDGERS_PER_DAY + 1). + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance that expired with the ledger jump. + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // The new day's simulated spend is evaluated against a reset counter, + // so the same 45 amount now succeeds. + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use_to` accounts for recipient validation (invalid +/// contract self-reference and merchant whitelist) in addition to the shared +/// pay-per-use checks. +#[test] +fn test_simulate_pay_per_use_to_recipient_validation() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Contract's own address is an invalid recipient. + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &contract_id), + PayPerUseSimResult::InvalidRecipient + ); + + // With whitelist enabled, a non-whitelisted recipient is rejected. + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, true); + }); + let random = Address::generate(&env); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &random), + PayPerUseSimResult::MerchantNotWhitelisted + ); + + // A valid, whitelisted recipient would succeed. + env.as_contract(&contract_id, || { + whitelist::add_merchant(&env, &merchant); + }); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &merchant), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use` rejects non-positive and over-cap amounts with the +/// same outcomes the real call enforces. +#[test] +fn test_simulate_pay_per_use_amount_bounds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No subscription yet, but amount bounds are checked before subscription. + assert_eq!( + client.simulate_pay_per_use(&user, &0), + PayPerUseSimResult::AmountMustBePositive + ); + assert_eq!( + client.simulate_pay_per_use(&user, &(MAX_AMOUNT + 1)), + PayPerUseSimResult::AmountExceedsMaximum + ); +} + +// ───────────────────────────────────────────── +// New Feature Unit Tests (Issues #628, #638, #640, #641) +// ───────────────────────────────────────────── + +#[test] +fn test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user2 = Address::generate(&env); + let user3_unknown = Address::generate(&env); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user2, &contract_id, &1_000_000_000, &100); + + client.subscribe( + &user1, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user2, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user1.clone()); + users.push_back(user2.clone()); + users.push_back(user3_unknown.clone()); + + let extended = client.batch_extend_subscription_ttl(&users); + assert_eq!(extended.len(), 2); + assert_eq!(extended.get(0).unwrap(), user1); + assert_eq!(extended.get(1).unwrap(), user2); +} + +#[test] +#[should_panic] +fn test_batch_extend_subscription_ttl_over_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + users.push_back(Address::generate(&env)); + } + + client.batch_extend_subscription_ttl(&users); +} + +#[test] +fn test_simulate_charge_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!(client.simulate_charge(&user), ChargeSimResult::Inactive); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. NotDue immediately after subscribe + assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); + + // Advance time past interval + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + // 3. WouldSucceed when due and allowed + assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); + + // 4. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::InsufficientAllowance + ); + + // Restore allowance + token.approve(&user, &contract_id, &1_000_000_000, &100); + + // 5. SubscriptionPaused when paused + client.pause(&user); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::SubscriptionPaused + ); + + // Resume + client.resume(&user); + + // 6. GracePeriodElapsed + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::GracePeriod, &3600u64); + }); + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 3601; + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::GracePeriodElapsed + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::ContractPaused + ); +} + +#[test] +fn test_get_schema_version_returns_zero_and_updates() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_schema_version(), 0); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_contract_address_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.pay_per_use_to(&user, &1_0000000, &contract_id); +} + +#[test] +fn test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 4_0000000; + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, amount); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #634: get_merchant_revenue_summary +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_summary_empty() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let summary = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary, (0, 0, 0, 0)); +} + +#[test] +fn test_merchant_revenue_summary_single_and_multiple_charges() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 10_0000000; + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.pay_per_use(&user, &amount); + + // First charge recorded: 10_0000000 + let summary1 = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary1, (amount, 1, amount, amount)); + + // Additional pay_per_use calls with different amounts + client.pay_per_use(&user, &5_0000000); + client.pay_per_use(&user, &25_0000000); + + let summary2 = client.get_merchant_revenue_summary(&merchant); + // total = 10 + 5 + 25 = 40_0000000 + // count = 3 + // min = 5_0000000 + // max = 25_0000000 + assert_eq!(summary2, (40_0000000, 3, 5_0000000, 25_0000000)); +} + +#[test] +fn test_merchant_revenue_summary_cleared_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &10_0000000); + client.clear_merchant_revenue_history(&merchant); + + let summary = client.get_merchant_revenue_summary(&merchant); + // History cleared -> total remains 10_0000000, count/min/max return 0 + assert_eq!(summary, (10_0000000, 0, 0, 0)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #635: get_subscription_health +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_subscription_health_non_existent_user() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let unknown = Address::generate(&env); + + let health = client.get_subscription_health(&unknown); + assert_eq!( + health, + SubscriptionHealth { + active: false, + charge_due: false, + within_grace: false, + has_sufficient_allowance: false, + is_paused: false, + trial_active: false, + daily_limit_set: false, + } + ); +} + +#[test] +fn test_subscription_health_active_healthy() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.charge_due, false); + assert_eq!(health.within_grace, false); + assert_eq!(health.has_sufficient_allowance, true); + assert_eq!(health.is_paused, false); + assert_eq!(health.trial_active, false); + assert_eq!(health.daily_limit_set, false); +} + +#[test] +fn test_subscription_health_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.is_paused, true); + assert_eq!(health.charge_due, false); +} + +#[test] +fn test_subscription_health_trial_active() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let trial_sec = 7 * 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &Some(trial_sec), + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.trial_active, true); +} + +#[test] +fn test_subscription_health_grace_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_grace_period(&86400); + client.commit_grace_period(); + + let interval = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Fast-forward ledger past interval, into grace period window + env.ledger().set(soroban_sdk::testutils::LedgerInfo { + timestamp: env.ledger().timestamp() + interval + 3600, + protocol_version: 20, + sequence_number: 100, + network_id: [0u8; 32], + base_reserve: 10, + min_temp_entry_ttl: 16, + min_persistent_entry_ttl: 16, + max_entry_ttl: 3110400, + }); + + let health = client.get_subscription_health(&user); + assert_eq!(health.charge_due, true); + assert_eq!(health.within_grace, true); +} + +#[test] +fn test_subscription_health_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Revoke allowance + token.approve(&user, &contract_id, &0, &1000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.has_sufficient_allowance, false); +} + +#[test] +fn test_subscription_health_daily_limit_set() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.daily_limit_set, true); +} + +/// set_initial_admin with proper auth when Admin is unset succeeds and stores admin. +#[test] +fn test_set_initial_admin_success_once() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// A second set_initial_admin call must return typed AdminAlreadySet (code 42), +/// not a raw string panic, and must not change the stored admin. +#[test] +fn test_set_initial_admin_second_call_returns_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin1 = Address::generate(&env); + let admin2 = Address::generate(&env); + + client.set_initial_admin(&admin1); + assert_eq!(client.get_admin(), Some(admin1.clone())); + + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "second set_initial_admin must map to ContractError::AdminAlreadySet" + ); + + // First admin is unchanged — no partial overwrite. + assert_eq!(client.get_admin(), Some(admin1)); +} + +/// Calling set_initial_admin without the proposed admin's auth must fail with an +/// authorization error (host-level, not a contract-level typed error) and must +/// not write the admin slot. +#[test] +fn test_set_initial_admin_unauthenticated_fails() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_set_initial_admin(&admin); + assert!( + result.is_err(), + "set_initial_admin without proposed admin auth must fail" + ); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "missing auth must be an authorization failure, not AdminAlreadySet" + ); + + assert!( + client.get_admin().is_none(), + "failed set_initial_admin must not persist admin" + ); +} + +/// Partial-init edge case: Token is already stored (e.g. from a separate +/// deploy-step) but Admin slot is still empty. set_initial_admin must still +/// require auth, succeed, and not be confused with initialize's state. +#[test] +fn test_set_initial_admin_token_present_admin_missing() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // Simulate partial init: write Token but not Admin. + env.as_contract(&contract_id, || { + storage::set_token(&env, &token_addr); + }); + + // Sanity: token stored, admin missing. + assert_eq!(client.get_token(), Some(token_addr.clone())); + assert!(client.get_admin().is_none()); + + // set_initial_admin must still require auth and succeed. + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin.clone())); + // Token state untouched. + assert_eq!(client.get_token(), Some(token_addr)); + + // Subsequent call returns typed error (not a panic) even in partial-init + // post-success state. + let admin2 = Address::generate(&env); + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "post-success second call must return AdminAlreadySet in partial-init scenario" + ); + assert_eq!(client.get_admin(), Some(admin)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #636: validate_interval hardening +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_subscribe_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &10_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic(expected = "Error(Contract, #19)")] +fn test_set_subscription_interval_below_min_interval_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Setting interval to 100 seconds when MinInterval is default 3600 panics with #19 (IntervalTooShort) + client.set_subscription_interval(&user, &100); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #637: WhitelistIndex & pagination +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_whitelist_index_size_page_and_swap_remove() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_whitelist_size(), 0); + assert_eq!(client.get_whitelist_page(&0, &10).len(), 0); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Idempotent double add does not increment index size + client.add_merchant(&m2); + + assert_eq!(client.get_whitelist_size(), 3); + + let page_all = client.get_whitelist_page(&0, &10); + assert_eq!(page_all.len(), 3); + assert_eq!(page_all.get(0).unwrap(), m1); + assert_eq!(page_all.get(1).unwrap(), m2); + assert_eq!(page_all.get(2).unwrap(), m3); + + // Test pagination offset & limit + let page_subset = client.get_whitelist_page(&1, &1); + assert_eq!(page_subset.len(), 1); + assert_eq!(page_subset.get(0).unwrap(), m2); + + // Remove middle item (m2) -> swap-remove moves m3 into index 1 + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); + + let page_after_remove = client.get_whitelist_page(&0, &10); + assert_eq!(page_after_remove.len(), 2); + assert_eq!(page_after_remove.get(0).unwrap(), m1); + assert_eq!(page_after_remove.get(1).unwrap(), m3); + + // Idempotent double remove does nothing + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #2)")] +fn test_subscription_amount_validation_zero() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount to 0 (panics with AmountMustBePositive, error 19) + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &0); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #15)")] +fn test_subscription_amount_validation_exceeds_max() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount above MAX_SUBSCRIPTION_AMOUNT + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &(crate::MAX_SUBSCRIPTION_AMOUNT + 1)); +} + +#[test] +fn test_batch_charge_estimate() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + + assert_eq!(estimate.len(), 1); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::NoSubscription + ); +} + +#[test] +fn test_contract_config() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let config = client.get_contract_config(); + assert_eq!(config.schema_version, 1); + assert_eq!(config.paused, false); +} + +#[test] +fn test_daily_spent_reset() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert!(client.get_day_start(&user).is_none()); +} + +// ───────────────────────────────────────────────────────────── +// Issue #11: extend_subscriber_index_ttl tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_extend_subscriber_index_ttl_empty_index_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_subscriber_count(), 0); + client.extend_subscriber_index_ttl(); + assert_eq!(client.get_subscriber_count(), 0); +} + +#[test] +fn test_extend_subscriber_index_ttl_emits_event_with_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 2); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_ttl_extended") + ); + assert_eq!(count, 2); +} + +#[test] +fn test_extend_subscriber_index_ttl_extends_large_index() { + use soroban_sdk::testutils::storage::Persistent as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + for _ in 0..5 { + let u = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe(&u, &merchant, &1_0000000, &86400, &token_addr, &None, &None); + users.push_back(u); + } + + assert_eq!(client.get_subscriber_count(), 5); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, _, data) = events.get(events.len() - 1).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + assert_eq!(count, 5); + + env.as_contract(&contract_id, || { + let ttl = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndexSize); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS); + + let ttl_0 = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndex(0)); + assert!(ttl_0 >= SUBSCRIPTION_TTL_LEDGERS); + }); +} + +#[test] +#[should_panic] +fn test_extend_subscriber_index_ttl_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.extend_subscriber_index_ttl(); +} + +// ───────────────────────────────────────────────────────────── +// Issue #838: clear_subscriber_index_entry admin repair +// ───────────────────────────────────────────────────────────── + +/// Simulate a stale index slot: the subscription is inactive but the +/// append-only index was never tombstoned (the corruption this repair +/// entrypoint is meant to fix). +fn deactivate_subscription_leaving_index(env: &Env, contract_id: &Address, user: &Address) { + env.as_contract(contract_id, || { + let mut sub = storage::get_subscription(env, user).expect("subscription"); + sub.active = false; + storage::set_subscription(env, user, &sub); + }); +} + +#[test] +fn test_clear_subscriber_index_entry_authorized_repair_tombstones_stale_slot() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_at(&0u64), Some(user.clone())); + + deactivate_subscription_leaving_index(&env, &contract_id, &user); + assert_eq!( + client.get_subscriber_at(&0u64), + Some(user.clone()), + "stale slot must still be visible before repair" + ); + + client.clear_subscriber_index_entry(&0u64); + + assert_eq!( + client.get_subscriber_at(&0u64), + None, + "repaired slot must be tombstoned" + ); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 0); + assert_eq!( + client.get_subscriber_count(), + 1, + "repair must not shrink the append-only index" + ); +} + +#[test] +#[should_panic] +fn test_clear_subscriber_index_entry_unauthorized_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + env.set_auths(&[]); + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +#[should_panic(expected = "Error(Contract, #41)")] +fn test_clear_subscriber_index_entry_refuses_active_subscriber() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +fn test_clear_subscriber_index_entry_emits_audit_event() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + client.clear_subscriber_index_entry(&0u64); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let index: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_cleared") + ); + assert_eq!(topic_user, user); + assert_eq!(index, 0); +} + +// ───────────────────────────────────────────────────────────── +// Issue #610: get_subscription_token tests +// ───────────────────────────────────────────────────────────── + +/// get_subscription_token returns None before the user subscribes. +#[test] +fn test_get_subscription_token_none_before_subscribe() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription_token(&random).is_none(), + "get_subscription_token should return None for a user with no subscription" + ); +} + +/// get_subscription_token returns Some(token) after subscribe. +#[test] +fn test_get_subscription_token_some_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) after subscribe" + ); +} + +/// get_subscription_token still returns Some(token) after cancel — the record +/// exists but is inactive; callers that need to distinguish active vs cancelled +/// should use get_subscription instead. +#[test] +fn test_get_subscription_token_some_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + // The subscription record still exists (active=false), so token is still readable. + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) for cancelled subscription" + ); +} + +/// get_subscription_token reflects the token when the user re-subscribes with +/// a different token. +#[test] +fn test_get_subscription_token_updates_on_resubscribe() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, &merchant, &1_0000000, &86400, &token_a, &None, &None, + ); + assert_eq!(client.get_subscription_token(&user), Some(token_a.clone())); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe( + &user, &merchant, &2_0000000, &86400, &token_b, &None, &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_b), + "get_subscription_token should return the latest token after resubscribe" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #611: propose_fee / commit_fee two-step tests +// ───────────────────────────────────────────────────────────── + +/// Full propose → commit flow sets the fee collector and bps. +#[test] +fn test_propose_and_commit_fee_sets_fee() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &250); + client.commit_fee(); + + let result = client.get_fee(); + assert!(result.is_some()); + let (stored_collector, stored_bps) = result.unwrap(); + assert_eq!(stored_collector, collector); + assert_eq!(stored_bps, 250); +} + +/// propose_fee emits a fee_proposed event. +#[test] +fn test_propose_fee_emits_fee_proposed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_proposed")); +} + +/// commit_fee emits a fee_committed event. +#[test] +fn test_commit_fee_emits_fee_committed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &50); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); +} + +/// commit_fee without a prior propose panics with NoPendingProposal (#23). +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_fee_without_proposal_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.commit_fee(); +} + +/// propose_fee with bps > 10000 panics with InvalidFeeBps (#13). +#[test] +#[should_panic(expected = "Error(Contract, #13)")] +fn test_propose_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_001); +} + +/// A re-propose before commit replaces the pending fee — commit applies +/// the latest proposal. +#[test] +fn test_repropose_before_commit_applies_latest() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector_a = Address::generate(&env); + let collector_b = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector_a, &100); + // Re-propose with different values before committing + client.propose_fee(&collector_b, &200); + client.commit_fee(); + + let (stored_collector, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_collector, collector_b); + assert_eq!(stored_bps, 200); +} + +/// After commit_fee, committing again without a new propose panics. +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_double_commit_without_repropose_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + client.commit_fee(); + // Second commit without a new propose must panic + client.commit_fee(); +} + +/// Bps of exactly 10000 (100%) is valid at both propose and commit. +#[test] +fn test_propose_fee_max_valid_bps() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_000); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 10_000); +} + +/// Bps of 0 is valid (disabling the fee while keeping the collector). +#[test] +fn test_propose_fee_zero_bps_valid() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &0); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 0); +} + +/// Non-admin calling propose_fee panics. +#[test] +#[should_panic] +fn test_propose_fee_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin set; require_admin call inside propose_fee should panic. + // NOTE: propose_fee in lib.rs calls bump_instance_ttl then fee::propose_fee. + // fee::propose_fee itself does not require_admin — the admin guard + // is the caller's responsibility in lib.rs. We verify the whole + // public entry point panics when no admin is configured. + let collector = Address::generate(&env); + + // Explicitly set an admin so admin check works, then revoke auths. + client.propose_fee(&collector, &100); +} + +// ───────────────────────────────────────────── +// Issue 012: commit_fee bounds re-validation +// ───────────────────────────────────────────── + +/// commit_fee rejects when bounds tightened after propose (bps above new max). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_above_max() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 500 bps — within default bounds (0, 10000) + client.propose_fee(&collector, &500); + + // Tighten max to 200 bps before commit + client.set_fee_bounds(&0, &200); + + // Commit should reject 500 bps against new [0, 200] bounds + client.commit_fee(); +} + +/// commit_fee rejects when bounds tightened after propose (bps below new min). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_below_min() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 50 bps + client.propose_fee(&collector, &50); + + // Raise min to 100 bps before commit + client.set_fee_bounds(&100, &10000); + + // Commit should reject 50 bps against new [100, 10000] bounds + client.commit_fee(); +} + +/// commit_fee succeeds when pending bps are within current bounds. +#[test] +fn test_commit_fee_succeeds_when_within_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_fee_bounds(&10, &500); + client.propose_fee(&collector, &200); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 200); +} + +/// commit_fee succeeds when no bounds are configured (defaults to 0..10000). +#[test] +fn test_commit_fee_succeeds_with_default_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // No set_fee_bounds call — defaults to (0, 10000) + client.propose_fee(&collector, &750); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 750); +} + +// ───────────────────────────────────────────── +// Batch queries tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_merchant_statuses_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.get_merchant_statuses(&merchants); + assert_eq!(result.len(), 0); +} + +#[test] +fn test_get_merchant_statuses_mixed() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); +} + +// Issue #9: validate_recipient_address tests +// ───────────────────────────────────────────── + +/// set_fee() with a valid (non-contract) collector address must succeed. +#[test] +fn test_validate_recipient_address_valid_passes() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + // Must not panic — a regular address is a valid fee collector. + client.propose_fee(&collector, &100u32); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 100u32))); +} + +/// set_fee() with the contract's own address as collector must panic with +/// ContractError::InvalidFeeCollector (error code 26). +#[test] +#[should_panic(expected = "Error(Contract, #26)")] +fn test_validate_recipient_address_contract_self_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Passing the contract address as fee collector must be rejected. + client.propose_fee(&contract_id, &100u32); + client.commit_fee(); +} +// ───────────────────────────────────────────────────────────── +// Issue #3: Per-Merchant Fee Recipient Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_set_and_get_merchant_fee_recipient() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + assert_eq!( + client.get_merchant_fee_recipient(&merchant), + Some(custom_recipient) + ); +} + +#[test] +fn test_set_merchant_fee_recipient_contract_address_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let res = client.try_set_merchant_fee_recipient(&merchant, &contract_id); + assert!(res.is_err()); +} + +#[test] +fn test_merchant_fee_recipient_routing_and_fallback() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(86400); + client.charge(&user); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + env.ledger().set_timestamp(172800); + client.charge(&user); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_get_next_charge_batch_empty_and_bounds() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 0); + + let batch_oob = client.get_next_charge_batch(&5, &10, &None); + assert_eq!(batch_oob.len(), 0); +} + +#[test] +fn test_get_next_charge_batch_filtering() { + let (env, contract_id, token_addr, user_due, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_not_due = setup_funded_user(&env, &contract_id, &token_addr); + let user_paused = setup_funded_user(&env, &contract_id, &token_addr); + let user_cancelled = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_paused, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_cancelled, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + client.pause(&user_paused); + client.cancel(&user_cancelled); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe(&user_not_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user_due); +} + +#[test] +fn test_get_next_charge_batch_pagination() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user2 = setup_funded_user(&env, &contract_id, &token_addr); + let user3 = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user3, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let batch1 = client.get_next_charge_batch(&0, &2, &None); + assert_eq!(batch1.len(), 2); + assert_eq!(batch1.get(0).unwrap(), user1); + assert_eq!(batch1.get(1).unwrap(), user2); + + let batch2 = client.get_next_charge_batch(&2, &2, &None); + assert_eq!(batch2.len(), 1); + assert_eq!(batch2.get(0).unwrap(), user3); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_next_charge_batch_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.get_next_charge_batch(&0, &51, &None); +} + +#[test] +fn test_get_next_charge_batch_exclude_lapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval, but WITHIN grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period - 100; + }); + + // It should be returned because it's due and not lapsed + let batch = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += 200; // past the grace period + }); + + // When exclude_lapsed is Some(true) or None, it should NOT be returned + let batch_exclude = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch_exclude.len(), 0); + + let batch_default = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch_default.len(), 0); + + // When exclude_lapsed is Some(false), it should be returned + let batch_include = client.get_next_charge_batch(&0, &10, &Some(false)); + assert_eq!(batch_include.len(), 1); + assert_eq!(batch_include.get(0).unwrap(), user); +} + +#[test] +fn test_merchant_fee_recipient_routes_pay_per_use_and_falls_back() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +// ───────────────────────────────────────────────────────────── +// Issue #4: Bounded Pause with Auto-Resume Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_pause_until_auto_resume_on_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(86400); + let res = client.try_charge(&user); + assert!(res.is_err()); + + env.ledger().set_timestamp(90000); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + assert_eq!(token.balance(&merchant), 1000); +} + +#[test] +fn test_pause_until_invalid_expiry_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(200000); + let res = client.try_pause_until(&user, &200000); + assert!(res.is_err()); + let res2 = client.try_pause_until(&user, &150000); + assert!(res2.is_err()); +} + +#[test] +fn test_resume_clears_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &300000); + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +#[test] +fn test_pause_until_auto_resume_on_batch_charge_and_clears_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(90000); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let result = client.batch_charge(&users); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +// ───────────────────────────────────────────────────────────── +// Issue #5: get_referral Read Function Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_referral_lifecycle() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer.clone())); + + client.cancel(&user); + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer)); +} + +// ───────────────────────────────────────────────────────────── +// Issue #6: Storage Migration v3 Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_migration_v2_to_v3_populates_referrer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + assert_eq!(client.get_schema_version(), 2); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + assert_eq!(client.get_schema_version(), 3); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.referrer, Some(referrer)); + + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────────────────────── +// Issue 011: ChargeResult discriminant stability (golden tests) +// ───────────────────────────────────────────────────────────── +// +// Off-chain parsers (keepers, alert-failed-charges.ts, indexers) +// decode ChargeResult by variant index. These tests lock the +// discriminant layout so a reorder or rename is caught in CI. + +/// The number of ChargeResult variants. If you add a new variant, +/// update this count AND append the new variant at the end of the enum. +#[test] +fn test_charge_result_variant_count() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + // Encode each variant via IntoVal and verify they produce distinct values. + // This also serves as a compile-time check: if a variant is removed or + // renamed, this test won't compile (exhaustive pattern match). + let charged: soroban_sdk::Val = ChargeResult::Charged.into_val(&env); + let skipped: soroban_sdk::Val = ChargeResult::Skipped.into_val(&env); + let no_sub: soroban_sdk::Val = ChargeResult::NoSubscription.into_val(&env); + let inactive: soroban_sdk::Val = ChargeResult::Inactive.into_val(&env); + let paused: soroban_sdk::Val = ChargeResult::Paused.into_val(&env); + let grace: soroban_sdk::Val = ChargeResult::GracePeriodElapsed.into_val(&env); + + // All variants must encode to distinct raw values + let c = unsafe { core::mem::transmute::(charged) }; + let s = unsafe { core::mem::transmute::(skipped) }; + let n = unsafe { core::mem::transmute::(no_sub) }; + let i = unsafe { core::mem::transmute::(inactive) }; + let p = unsafe { core::mem::transmute::(paused) }; + let g = unsafe { core::mem::transmute::(grace) }; + + assert_ne!(c, s, "Charged and Skipped must differ"); + assert_ne!(s, n, "Skipped and NoSubscription must differ"); + assert_ne!(n, i, "NoSubscription and Inactive must differ"); + assert_ne!(i, p, "Inactive and Paused must differ"); + assert_ne!(p, g, "Paused and GracePeriodElapsed must differ"); + + // Lock the variant count — increase when a variant is appended. + let total_variants = 6; + assert_eq!(total_variants, 6); +} + +/// Verify round-trip encoding for every variant. +#[test] +fn test_charge_result_round_trip() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + let variants = [ + ChargeResult::Charged, + ChargeResult::Skipped, + ChargeResult::NoSubscription, + ChargeResult::Inactive, + ChargeResult::Paused, + ChargeResult::GracePeriodElapsed, + ]; + + for variant in variants.iter() { + let val: soroban_sdk::Val = variant.clone().into_val(&env); + let decoded = ChargeResult::try_from_val(&env, &val).unwrap(); + assert_eq!(*variant, decoded, "round-trip failed for a ChargeResult variant"); + } +} + +/// Verify that variant names match the expected set. +/// A rename or reorder breaks this test. +#[test] +fn test_charge_result_partial_eq_identity() { + assert_eq!(ChargeResult::Charged, ChargeResult::Charged); + assert_ne!(ChargeResult::Charged, ChargeResult::Skipped); + assert_ne!(ChargeResult::NoSubscription, ChargeResult::Inactive); + assert_ne!(ChargeResult::Paused, ChargeResult::GracePeriodElapsed); +} + + +// ───────────────────────────────────────────── +// CONTRACT-804: checked arithmetic in trial, fee, and volume paths +// ───────────────────────────────────────────── + +#[test] +fn test_extend_trial_pushes_last_charged_forward() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.extend_trial(&user, &86400); + + assert_eq!( + client.get_subscription(&user).unwrap().last_charged, + before + 86400 + ); +} + +/// A trial extension past `u64::MAX` must fail closed with the typed +/// `ArithmeticOverflow` (#36) rather than an untyped `unwrap` panic. +#[test] +fn test_extend_trial_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // Push last_charged to the u64 ceiling, then ask for one second more. + client.extend_trial(&user, &(u64::MAX - client.get_subscription(&user).unwrap().last_charged)); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, u64::MAX); + + let res = client.try_extend_trial(&user, &1); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// Extending a paused subscription's trial must fail closed with the typed +/// `SubscriptionPaused` (#17) error rather than advancing `last_charged` into +/// a chargeable state. +#[test] +fn test_extend_trial_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.pause(&user); + + let res = client.try_extend_trial(&user, &86400); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(17)))); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, before); +} + +/// `amount * bps` must not wrap for amounts beyond the economic caps. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_calculate_fee_amount_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + fee::calculate_fee_amount(&env, i128::MAX, 10_000); + }); +} + +#[test] +fn test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + // The largest amount the contract will accept, at the maximum bps. + assert_eq!( + fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 10_000), + MAX_SUBSCRIPTION_AMOUNT + ); + assert_eq!(fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 0), 0); + }); +} + +/// Accruing a fee onto a `TotalProtocolFees` counter at `i128::MAX` must fail +/// closed rather than wrap the protocol's own bookkeeping. +#[test] +fn test_protocol_fee_accrual_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + configure_fee(&env, &contract_id, 500); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::TotalProtocolFees, &i128::MAX); + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let res = client.try_charge(&user); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// An accumulator that cannot represent the sum is an overflow (#36), which is +/// a different failure from breaching the hourly cap (#28). +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_accumulator_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: env.ledger().timestamp(), + accumulated_volume: i128::MAX, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// A window start near `u64::MAX` must not wrap the rollover comparison. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_window_end_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: u64::MAX, + accumulated_volume: 0, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// Breaching the hourly cap still reports `GlobalVolumeExceeded` (#28) — +/// the overflow work above must not have changed the cap's error mapping. +#[test] +#[should_panic(expected = "Error(Contract, #28)")] +fn test_global_volume_cap_breach_still_reports_28() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + check_and_update_global_volume(&env, GLOBAL_MAX_VOLUME_PER_HOUR + 1); + }); +} + +// ───────────────────────────────────────────── +// CONTRACT-805: batch_charge_skips summary event +// ───────────────────────────────────────────── + +/// Helper: returns the payload of the single `batch_charge_skips` event in the +/// event log, or `None` when no such event was emitted. +fn find_batch_charge_skips(env: &Env) -> Option { + let mut found = None; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol == Symbol::new(env, "batch_charge_skips") { + assert_eq!( + topics.len(), + 1, + "batch_charge_skips carries no address topic" + ); + assert!( + found.is_none(), + "at most one summary event per batch_charge call" + ); + found = Some(data.try_into_val(env).unwrap()); + } + } + found +} + +/// Helper: funds a fresh user and subscribes them for `interval`. +fn subscribe_funded_user( + env: &Env, + contract_id: &Address, + token_addr: &Address, + merchant: &Address, + interval: u64, +) -> Address { + let client = FlowPayClient::new(env, contract_id); + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200000); + client.subscribe( + &user, + merchant, + &1_0000000, + &interval, + token_addr, + &None, + &None, + ); + user +} + +/// A batch mixing charges with paused / cancelled / missing / grace-elapsed +/// subscriptions emits one summary event whose counts reconcile with the +/// returned results. +#[test] +fn test_batch_charge_emits_skips_summary_with_counts() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + install_admin(&env, &contract_id); + client.propose_grace_period(&3600); + client.commit_grace_period(); + + let paused_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let cancelled_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let grace_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + client.pause(&paused_user); + client.cancel(&cancelled_user); + + // Push grace_user past its interval AND its grace window. + env.ledger().with_mut(|l| { + l.timestamp += interval + 3601 + 1; + }); + + // Subscribe the chargeable user now, then advance just past its interval so + // it is due but still inside the grace window. + let chargeable = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(chargeable.clone()); + users.push_back(paused_user.clone()); + users.push_back(cancelled_user.clone()); + users.push_back(grace_user.clone()); + users.push_back(unknown_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Paused); + assert_eq!(results.get(2).unwrap(), ChargeResult::Inactive); + assert_eq!(results.get(3).unwrap(), ChargeResult::GracePeriodElapsed); + assert_eq!(results.get(4).unwrap(), ChargeResult::NoSubscription); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 5); + assert_eq!(summary.charged, 1); + assert_eq!(summary.not_due, 0); + assert_eq!(summary.paused, 1); + assert_eq!(summary.inactive, 1); + assert_eq!(summary.grace_elapsed, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.ledger_sequence, env.ledger().sequence()); + + // The counts must account for every submitted address. + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// An all-success batch must not emit the summary — and its `charged` events +/// are unchanged. +#[test] +fn test_batch_charge_all_charged_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Charged); + + assert!( + find_batch_charge_skips(&env).is_none(), + "an all-charged batch must stay silent" + ); + + // `charged` events are untouched by this feature. + let charged_events = env + .events() + .all() + .iter() + .filter(|(_, topics, _)| { + let s: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + s == Symbol::new(&env, "charged") + }) + .count(); + assert_eq!(charged_events, 2); +} + +/// Not-due skips are the common, uninteresting outcome and must not emit. +#[test] +fn test_batch_charge_not_due_only_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Skipped); + assert_eq!(results.get(1).unwrap(), ChargeResult::Skipped); + + assert!( + find_batch_charge_skips(&env).is_none(), + "a not-due-only batch must stay silent" + ); +} + +/// An allowance shortfall is a per-user `AllowanceInsufficient` result (it does +/// not abort the batch) and is an interesting failure: it alone must emit the +/// summary, since a keeper needs to know a subscriber has to re-approve. +#[test] +fn test_batch_charge_allowance_insufficient_counted_in_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let interval: u64 = 86400; + + let ok_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let broke_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + // One stroop short of the gross subscription amount. + token.approve(&broke_user, &contract_id, &(1_0000000 - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(ok_user.clone()); + users.push_back(broke_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!( + results.get(1).unwrap(), + ChargeResult::AllowanceInsufficient + ); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.charged, 1); + assert_eq!(summary.allowance_insufficient, 1); + assert_eq!(summary.not_due, 0); + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// A single interesting failure alongside not-due skips is enough to emit, +/// and the not-due count rides along for reconciliation. +#[test] +fn test_batch_charge_single_interesting_failure_emits_with_not_due_count() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let not_due_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(not_due_user.clone()); + users.push_back(unknown_user.clone()); + + client.batch_charge(&users); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.not_due, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.charged, 0); +} + +// ───────────────────────────────────────────────────────────── +// Issue 041 (#836): MerchantFeeRecipient clearing tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_merchant_fee_recipient_cleared_on_remove_and_freeze() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + let recipient = Address::generate(&env); + + client.add_merchant(&merchant); + client.set_merchant_fee_recipient(&merchant, &recipient); + assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); + + client.remove_merchant(&merchant); + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); + + client.add_merchant(&merchant); + client.set_merchant_fee_recipient(&merchant, &recipient); + assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); + + client.freeze_merchant(&merchant, &None); + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); +} + +// ───────────────────────────────────────────────────────────── +// Issue 033 (#828): Grace period TTL expiry tests +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_grace_period_commit_expired_proposal_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + client.propose_grace_period(&3600); + + env.ledger().with_mut(|l| { + l.sequence_number += 20000; + }); + + client.commit_grace_period(); +} + +#[test] +fn test_grace_period_propose_commit_happy_path() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + client.propose_grace_period(&7200); + + env.ledger().with_mut(|l| { + l.sequence_number += 100; + }); + + client.commit_grace_period(); + assert_eq!(client.get_grace_period(), 7200); +} + +// ───────────────────────────────────────────────────────────── +// Issue 034 (#829): Self-transfer & contract-as-user hazards +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_transfer_subscription_self_transfer_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &user); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_transfer_subscription_to_contract_address_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &contract_id); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_subscribe_self_subscription_panics() { + let (env, contract_id, token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &user, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_subscribe_contract_as_user_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &contract_id, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +// Issue #813: batch_charge stress / resource-envelope coverage +// +// These tests exercise `batch_charge` at the configured max batch size and one +// above it, matching the resource envelope documented for `set_max_batch_size`. +// Soroban's per-invocation budget is finite, so each test resets it to +// unlimited up front (`env.budget().reset_unlimited()`, as the existing +// `test_batch_charge_stress` does) so the setup + one `batch_charge` invocation +// is measured without being throttled by the 200 M default budget. +// +// Approximate resource usage for a max-size batch at the default cap (50): +// - cost(n) ~= 50 x (storage read + fee + token transfer_from + events) +// - at a configured cap of 5 the per-entry cost is identical; only `n` varies. +// The relevant ceiling enforced here is the batch-size check in `batch.rs`, +// which fires *before* any charging, so exceeding the cap panics with +// `ContractError::BatchTooLarge` (#20) rather than executing partial work. + +/// Batch-charge exactly the configured max batch size; all entries succeed. +#[test] +fn test_batch_charge_at_configured_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), batch_limit); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..batch_limit { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the configured max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_above_configured_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..=batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +/// Batch-charge the default max (50) without explicit configuration succeeds. +#[test] +fn test_batch_charge_at_default_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..50 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), 50); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..50u32 { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the default max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +// +// Issue #810: authorization-boundary tests +// +// Each admin entrypoint is tested in two states: +// (a) success with admin auth called via the normal client method inside +// `mock_all_auths` +// (b) panic when no admin is set called via try_* so the contract error is +// surfaced as an Err, not a hard panic +// +// Note: `setup()` enables `env.mock_all_auths()`, so a "non-admin rejected" +// variant cannot force `require_admin` to fail in this environment; rejection +// is instead covered by the no-admin panic path and the contract's own +// `require_admin` guard. +// + +// -- freeze_merchant ---------------------------------------------------------- + +/// Admin can freeze a merchant (happy path). +#[test] +fn test_freeze_merchant_admin_success() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.freeze_merchant(&merchant, &None); + + assert!(client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant panics when no admin has been set. +#[test] +fn test_freeze_merchant_no_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_freeze_merchant(&merchant, &None); + assert!(result.is_err()); +} + +// -- propose_fee -------------------------------------------------------------- + +/// Admin can propose a fee (happy path). +#[test] +fn test_propose_fee_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + + assert_eq!(client.get_fee(), None); +} + +/// propose_fee panics when no admin has been set. +#[test] +fn test_propose_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + let result = client.try_propose_fee(&collector, &100); + assert!(result.is_err()); +} + +// -- set_min_interval --------------------------------------------------------- + +/// Admin can set min_interval (happy path). +#[test] +fn test_set_min_interval_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_min_interval(&7200); + assert_eq!(client.get_min_interval(), 7200); +} + +/// set_min_interval panics when no admin has been set. +#[test] +fn test_set_min_interval_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_min_interval(&7200); + assert!(result.is_err()); +} + +// -- batch_cancel ------------------------------------------------------------- + +/// Admin can batch-cancel subscriptions (happy path). +#[test] +fn test_batch_cancel_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_cancel(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(!sub.active); +} + +/// batch_cancel panics when no admin has been set. +#[test] +fn test_batch_cancel_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_cancel(&users); + assert!(result.is_err()); +} + +// -- whitelist_batch_add ------------------------------------------------------ + +/// Admin can batch-add merchants to the whitelist (happy path). +#[test] +fn test_whitelist_batch_add_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + let added = client.whitelist_batch_add(&merchants); + assert_eq!(added, 2); +} + +/// whitelist_batch_add panics when no admin has been set. +#[test] +fn test_whitelist_batch_add_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.try_whitelist_batch_add(&merchants); + assert!(result.is_err()); +} + +// -- batch_pause_subscriptions ------------------------------------------------ + +/// Admin can batch-pause subscriptions (happy path). +#[test] +fn test_batch_pause_subscriptions_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_pause_subscriptions(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(sub.paused); +} + +/// batch_pause_subscriptions panics when no admin has been set. +#[test] +fn test_batch_pause_subscriptions_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_pause_subscriptions(&users); + assert!(result.is_err()); +} + +// -- clear_fee ---------------------------------------------------------------- + +/// Admin can clear fee (happy path). +#[test] +fn test_clear_fee_admin_success() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + assert!(client.get_fee().is_some()); + + client.clear_fee(); + assert_eq!(client.get_fee(), None); +} + +/// clear_fee panics when no admin has been set. +#[test] +fn test_clear_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_clear_fee(); + assert!(result.is_err()); +} + +// -- set_whitelist_enabled ---------------------------------------------------- + +/// Admin can toggle whitelist on/off (happy path). +#[test] +fn test_set_whitelist_enabled_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_whitelist_enabled(&true); + assert!(client.is_whitelist_enabled()); + + client.set_whitelist_enabled(&false); + assert!(!client.is_whitelist_enabled()); +} + +/// set_whitelist_enabled panics when no admin has been set. +#[test] +fn test_set_whitelist_enabled_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_whitelist_enabled(&true); + assert!(result.is_err()); +} + +// -- set_max_batch_size ------------------------------------------------------- + +/// Admin can set max_batch_size (happy path). +#[test] +fn test_set_max_batch_size_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_batch_size(&100); + assert_eq!(client.get_max_batch_size(), 100); +} + +/// set_max_batch_size panics when no admin has been set. +#[test] +fn test_set_max_batch_size_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_max_batch_size(&100); + assert!(result.is_err()); +} + +// -- pause_contract ----------------------------------------------------------- + +/// Admin can pause the contract (happy path). +#[test] +fn test_pause_contract_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.pause_contract(); + assert!(client.is_contract_paused()); +} + +/// pause_contract panics when no admin has been set. +#[test] +fn test_pause_contract_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_pause_contract(); + assert!(result.is_err()); +} + +// -- migrate ------------------------------------------------------------------ + +/// Admin can run storage migration (happy path). +#[test] +fn test_migrate_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +/// migrate panics when no admin has been set. +#[test] +fn test_migrate_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_migrate(&users); + assert!(result.is_err()); +} + +// -- set_global_volume_cap ---------------------------------------------------- + +/// Admin can set the global volume cap (happy path). +#[test] +fn test_set_global_volume_cap_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_global_volume_cap(&100_0000000); + assert_eq!(client.get_global_volume_cap(), 100_0000000); +} + +/// set_global_volume_cap panics when no admin has been set. +#[test] +fn test_set_global_volume_cap_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_global_volume_cap(&100_0000000); + assert!(result.is_err()); +} + +// ───────────────────────────────────────────────────────────────────── +// Issue #823: Pagination safety tests for get_active_subscriber_page +// ───────────────────────────────────────────────────────────────────── +// +// Pagination semantics under tombstones: +// +// `get_active_subscriber_page(offset, limit)` scans the subscriber index +// starting at slot `offset`, examining up to `limit` slots (capped at 50). +// Tombstoned (cancelled) and inactive slots are skipped; only active +// subscribers are returned. +// +// IMPORTANT: `offset` is a slot index, NOT a result count. Keepers MUST +// track the next slot to scan (i.e., the slot index after the last slot +// examined), not the number of results received. Calling with +// `offset = previous_offset + limit` is safe and guarantees eventual +// coverage of all active subscribers. +// +// The scan is bounded: at most `min(limit, 50)` slots are examined per +// call, preventing unbounded iteration even when the index is sparse. + +/// Helper: subscribes multiple users and returns them in order. +fn subscribe_users( + env: &Env, + client: &FlowPayClient, + token_addr: &Address, + merchant: &Address, + count: u32, +) -> soroban_sdk::Vec
{ + let mut users = soroban_sdk::Vec::new(env); + for _ in 0..count { + let user = setup_funded_user(env, &client.address, token_addr); + client.subscribe( + &user, + merchant, + &1_0000000, + &86400, + token_addr, + &None, + &None, + ); + users.push_back(user.clone()); + } + users +} + +/// Pagination with no tombstones: get_active_subscriber_page returns all +/// active subscribers across consecutive pages. +#[test] +fn test_active_subscriber_page_no_tombstones_covers_all() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let users = subscribe_users(&env, &client, &token_addr, &merchant, 5); + + let page1 = client.get_active_subscriber_page(&0u64, &3u32); + assert_eq!(page1.len(), 3); + let page2 = client.get_active_subscriber_page(&3u64, &3u32); + assert_eq!(page2.len(), 2); + let page3 = client.get_active_subscriber_page(&5u64, &3u32); + assert_eq!(page3.len(), 0); + + let mut all = soroban_sdk::Vec::new(&env); + for addr in page1.iter() { + all.push_back(addr); + } + for addr in page2.iter() { + all.push_back(addr); + } + assert_eq!(all.len(), 5); +} + +/// Pagination with interleaved cancellations: keepers advancing offset +/// by limit each call eventually scan all active subscribers. +#[test] +fn test_active_subscriber_page_with_tombstones_covers_all() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let users = subscribe_users(&env, &client, &token_addr, &merchant, 6); + + // Cancel users at even indices (slots 0, 2, 4) + client.cancel(&users.get(0).unwrap()); + client.cancel(&users.get(2).unwrap()); + client.cancel(&users.get(4).unwrap()); + + // Page through with limit=2 + let mut collected = soroban_sdk::Vec::new(&env); + let mut offset: u64 = 0; + let limit: u32 = 2; + let max_iterations = 20; // safety bound for test + let mut iter = 0; + while iter < max_iterations { + let page = client.get_active_subscriber_page(&offset, &limit); + if page.is_empty() { + break; + } + for addr in page.iter() { + collected.push_back(addr); + } + offset += limit as u64; + iter += 1; + } + + // All 3 active users (slots 1, 3, 5) should be collected + assert_eq!(collected.len(), 3); +} + +/// Pagination: offset beyond index size returns empty immediately. +#[test] +fn test_active_subscriber_page_offset_beyond_count_returns_empty() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let users = subscribe_users(&env, &client, &token_addr, &merchant, 3); + + let page = client.get_active_subscriber_page(&100u64, &10u32); + assert!(page.is_empty()); +} + +/// Pagination: zero limit returns empty immediately. +#[test] +fn test_active_subscriber_page_zero_limit_returns_empty() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let users = subscribe_users(&env, &client, &token_addr, &merchant, 3); + + let page = client.get_active_subscriber_page(&0u64, &0u32); + assert!(page.is_empty()); +} + +/// Pagination: all subscribers cancelled yields empty pages. +#[test] +fn test_active_subscriber_page_all_cancelled_returns_empty() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let users = subscribe_users(&env, &client, &token_addr, &merchant, 3); + + client.cancel(&users.get(0).unwrap()); + client.cancel(&users.get(1).unwrap()); + client.cancel(&users.get(2).unwrap()); + + let page = client.get_active_subscriber_page(&0u64, &50u32); + assert!(page.is_empty()); +} + +/// Pagination: scan is bounded — even with a sparse index, the loop +/// terminates after examining at most `min(limit, 50)` slots. +#[test] +fn test_active_subscriber_page_bounded_scan_with_sparse_index() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create 10 subscribers + let users = subscribe_users(&env, &client, &token_addr, &merchant, 10); + + // Cancel all but the last one + for i in 0..9 { + client.cancel(&users.get(i).unwrap()); + } + + // Scan with limit=5 from offset=0: examines slots 0-4, all cancelled + let page = client.get_active_subscriber_page(&0u64, &5u32); + assert!(page.is_empty()); + + // Scan with limit=5 from offset=5: examines slots 5-9, only slot 9 active + let page2 = client.get_active_subscriber_page(&5u64, &5u32); + assert_eq!(page2.len(), 1); + assert_eq!(page2.get(0).unwrap(), users.get(9).unwrap()); +} + +/// Pagination: interleaved active and cancelled — full scan collects all +/// active subscribers without infinite loop. +#[test] +fn test_active_subscriber_page_alternating_active_cancelled() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create 6 subscribers: slots 0-5 + let users = subscribe_users(&env, &client, &token_addr, &merchant, 6); + + // Cancel slots 1, 3 (alternating) + client.cancel(&users.get(1).unwrap()); + client.cancel(&users.get(3).unwrap()); + + // Full scan with large limit + let page = client.get_active_subscriber_page(&0u64, &50u32); + assert_eq!(page.len(), 4); // slots 0, 2, 4, 5 are active +} + +/// Pagination: resubscribe after cancel adds new slot, doesn't break scan. +/// The tombstone check prevents the old slot from appearing as a duplicate. +#[test] +fn test_active_subscriber_page_resubscribe_after_cancel() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user = setup_funded_user(&env, &client.address, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + // Cancel: slot 0 becomes tombstoned + client.cancel(&user); + + // Resubscribe: new slot 1 is appended + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 2); + + // Full scan should find the user in slot 1 + let page = client.get_active_subscriber_page(&0u64, &50u32); + assert_eq!(page.len(), 1); + assert_eq!(page.get(0).unwrap(), user); +} + +/// Pagination: keeper-style iteration with offset advancing by limit +/// eventually terminates and collects all active users exactly once. +#[test] +fn test_active_subscriber_page_keeper_iteration_terminates() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create 8 subscribers + let users = subscribe_users(&env, &client, &token_addr, &merchant, 8); + + // Cancel slots 1, 4, 6 + client.cancel(&users.get(1).unwrap()); + client.cancel(&users.get(4).unwrap()); + client.cancel(&users.get(6).unwrap()); + + // Keeper iterates with limit=3, offset advancing by limit each time + let mut collected = soroban_sdk::Vec::new(&env); + let mut offset: u64 = 0; + let limit: u32 = 3; + let mut safety = 0; + loop { + let page = client.get_active_subscriber_page(&offset, &limit); + if page.is_empty() || safety > 20 { + break; + } + for addr in page.iter() { + collected.push_back(addr); + } + offset += limit as u64; + safety += 1; + } + + // 5 active users: slots 0, 2, 3, 5, 7 + assert_eq!(collected.len(), 5); +} + +/// Pagination: limit capped at 50 even if larger value passed. +#[test] +fn test_active_subscriber_page_limit_capped_at_50() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create 5 subscribers + let users = subscribe_users(&env, &client, &token_addr, &merchant, 5); + + // Request limit=100 — should be capped at 50, but only 5 exist + let page = client.get_active_subscriber_page(&0u64, &100u32); + assert_eq!(page.len(), 5); +} + +/// Pagination: all slots cancelled except the very last — scan finds it. +#[test] +fn test_active_subscriber_page_only_last_active() { + let (env, contract_id, token_addr, _, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = subscribe_users(&env, &client, &token_addr, &merchant, 10); + + // Cancel first 9 + for i in 0..9 { + client.cancel(&users.get(i).unwrap()); + } + + // Full scan + let page = client.get_active_subscriber_page(&0u64, &50u32); + assert_eq!(page.len(), 1); + assert_eq!(page.get(0).unwrap(), users.get(9).unwrap()); +} + + +![cfg(test)] +#![allow( + clippy::bool_assert_comparison, + unused_variables, + dead_code, + clippy::inconsistent_digit_grouping +)] + +use super::*; +use soroban_sdk::{ + testutils::{Address as _, Events as _, Ledger}, + token::{Client as TokenClient, StellarAssetClient}, + Address, BytesN, Env, IntoVal, Symbol, TryFromVal, TryIntoVal, Vec, +}; + +/// Returns (env, contract_id, token_addr, user, merchant) +fn setup() -> (Env, Address, Address, Address, Address) { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION + // so that subscribe_inner's migration invariant guard is satisfied. + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + (env, contract_id, token_addr, user, merchant) +} + +/// Helper: deploy second token +fn setup_second_token(env: &Env, contract_id: &Address, user: &Address) -> Address { + let token_admin = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let sac = StellarAssetClient::new(env, &token_addr); + sac.mint(user, &10_000_0000000); + + let token = TokenClient::new(env, &token_addr); + token.approve(user, contract_id, &10_000_0000000, &200000); + + token_addr +} + +fn setup_funded_user(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200); + + user +} + +fn assert_last_event(env: &Env, topic: &str) { + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let data_unit: () = data.try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(data_unit, ()); +} + +fn assert_last_user_event(env: &Env, topic: &str, user: &Address) { + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(topic_user, user.clone()); +} + +fn count_user_events(env: &Env, topic: &str, user: &Address) -> u32 { + let expected_topic = Symbol::new(env, topic); + let mut count = 0; + + for (_, topics, _) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol != expected_topic { + continue; + } + + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + if topic_user == user.clone() { + count += 1; + } + } + + count +} + +// ───────────────────────────────────────────── +// Core functionality tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_and_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!(sub.token, token_addr); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + assert!(sub_after.last_charged > 0); +} +#[test] +fn test_subscription_age_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + env.ledger().with_mut(|l| { + l.timestamp = 1; + }); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed: u64 = 1000; + env.ledger().with_mut(|l| { + l.timestamp += elapsed; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed)); +} + +#[test] +fn test_subscription_age_resets_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 5000; + }); + + client.cancel(&user); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed_after_resub: u64 = 200; + env.ledger().with_mut(|l| { + l.timestamp += elapsed_after_resub; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed_after_resub)); +} + +#[test] +fn test_subscription_age_none_when_no_subscription() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_subscription_age_none_for_migrated_sentinel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Simulate a pre-existing subscription migrated with the created_at = 0 sentinel + env.as_contract(&contract_id, || { + let key = crate::DataKey::Subscription(user.clone()); + let mut sub: crate::Subscription = env.storage().persistent().get(&key).unwrap(); + sub.created_at = 0; + env.storage().persistent().set(&key, &sub); + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_batch_charge_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let results = client.batch_charge(&soroban_sdk::vec![&env]); + assert_eq!(results.len(), 0); +} + +/// charge() must decrease user balance and increase merchant balance by exactly the subscription amount. +#[test] +fn test_charge_exact_transfer_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by exactly the subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by exactly the subscription amount" + ); +} + +#[test] +fn test_charged_event_includes_ledger_sequence() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + l.sequence_number += 7; + }); + + client.charge(&user); + + let mut seen_charge_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "charged") { + let event_data: crate::events::ChargeEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.ledger_sequence, env.ledger().sequence()); + seen_charge_event = true; + } + } + + assert!(seen_charge_event, "expected a charged event"); +} + +#[test] +fn test_charge_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +#[test] +fn test_charge_routes_net_to_custom_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + // merchant sets a custom recipient (directly write persistent storage for test) + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&DataKey::MerchantFeeRecipient(merchant.clone()), &recipient); + env.storage().persistent().extend_ttl( + &DataKey::MerchantFeeRecipient(merchant.clone()), + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + }); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let recipient_before = token.balance(&recipient); + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_fee); + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +// ───────────────────────────────────────────── +// CONTRACT-802: gross-allowance preflight before the two-leg fee transfer +// ───────────────────────────────────────────── + +/// Helper: installs an admin and commits `bps` with a fresh collector. +fn configure_fee(env: &Env, contract_id: &Address, bps: u32) -> Address { + let client = FlowPayClient::new(env, contract_id); + install_admin(env, contract_id); + let collector = Address::generate(env); + client.propose_fee(&collector, &bps); + client.commit_fee(); + collector +} + +/// An allowance exactly equal to the gross amount must cover BOTH transfer +/// legs (fee + net) when fee_bps > 0. +#[test] +fn test_charge_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Tighten the allowance to exactly the gross amount — not a stroop more. + token.approve(&user, &contract_id, &amount, &200000); + assert_eq!(token.allowance(&user, &contract_id), amount); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + // Both legs drew on the same allowance, consuming it exactly. + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// One stroop short of the gross amount must fail closed with the typed +/// `InsufficientAllowance` (#8) and move no funds on either leg. +#[test] +fn test_charge_allowance_below_gross_fails_closed_before_any_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &(amount - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let res = client.try_charge(&user); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + // Neither leg ran: the fee leg alone would have fit in the allowance. + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// A fee that rounds down to zero still charges the full gross amount and +/// needs the full gross allowance. +#[test] +fn test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + // 1 * 500 / 10_000 == 0 — the fee leg is skipped entirely. + let amount: i128 = 1; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), amount); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// The maximum in-bounds fee (10_000 bps == 100%) sends everything to the +/// collector and still passes the single gross preflight. +#[test] +fn test_charge_max_bps_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 10_000); // 100% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), amount); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// pay_per_use runs the same two-leg pattern and the same preflight. +#[test] +fn test_pay_per_use_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + token.approve(&user, &contract_id, &amount, &200000); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +#[test] +fn test_pay_per_use_allowance_below_gross_fails_closed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + token.approve(&user, &contract_id, &(amount - 1), &200000); + + let res = client.try_pay_per_use(&user, &amount); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + assert_eq!(token.balance(&collector), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +// ───────────────────────────────────────────── +// Issue #837 / Issue 042: shared allowance-requirement helper +// ───────────────────────────────────────────── + +struct AllowanceReqCase { + allowance: i128, + gross: i128, + fee_bps: u32, + expected: bool, + label: &'static str, +} + +/// Table-driven unit tests for the shared allowance helper: zero, exact, and +/// insufficient allowance, plus fee-off vs fee-on gross (never net-only). +#[test] +fn test_allowance_covers_gross_table() { + let gross: i128 = 10_000; + let fee_on_bps: u32 = 500; // 5% + let fee_on_net: i128 = gross - (gross * fee_on_bps as i128 / 10_000); // 9_500 + + let cases = [ + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: 0, + expected: false, + label: "zero allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "zero allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: 0, + expected: true, + label: "exact allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "exact gross allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: 0, + expected: false, + label: "insufficient (one stroop short), fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "insufficient (one stroop short of gross), fee_bps > 0", + }, + AllowanceReqCase { + allowance: fee_on_net, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "fee-on net-only allowance is insufficient vs gross", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: 0, + expected: true, + label: "surplus allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "surplus allowance, fee_bps > 0", + }, + ]; + + for c in cases { + assert_eq!( + validation::required_allowance(c.gross, c.fee_bps), + c.gross, + "required allowance must be gross ({})", + c.label + ); + assert_eq!( + validation::allowance_covers_gross(c.allowance, c.gross, c.fee_bps), + c.expected, + "{}", + c.label + ); + } +} + +struct SimulateAllowanceCase { + fee_bps: u32, + allowance: i128, + expected: ChargeSimResult, + label: &'static str, +} + +/// `simulate_charge` uses the shared helper: fee-off and fee-on both require +/// the gross amount, so a net-only allowance fails when fees are on. +#[test] +fn test_simulate_charge_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SimulateAllowanceCase { + fee_bps: 0, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "insufficient allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact gross allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "one stroop short of gross, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expected: ChargeSimResult::InsufficientAllowance, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + token.approve(&user, &contract_id, &c.allowance, &200000); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + assert_eq!(client.simulate_charge(&user), c.expected, "{}", c.label); + } +} + +struct SubscribeAllowanceCase { + fee_bps: u32, + allowance: i128, + expect_ok: bool, + label: &'static str, +} + +/// subscribe() validation uses the same gross-allowance helper, including +/// when protocol fees are configured (requirement is still the gross amount). +#[test] +fn test_subscribe_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SubscribeAllowanceCase { + fee_bps: 0, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount, + expect_ok: true, + label: "exact allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expect_ok: false, + label: "insufficient allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expect_ok: true, + label: "exact gross allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expect_ok: false, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + token.approve(&user, &contract_id, &c.allowance, &200000); + let result = + client.try_subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + if c.expect_ok { + assert!(result.is_ok(), "{}", c.label); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, amount, "{}", c.label); + } else { + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error(8))), + "{}", + c.label + ); + assert!( + client.get_subscription(&user).is_none(), + "failed subscribe must not write storage ({})", + c.label + ); + } + } +} + +/// `has_sufficient_allowance` reads SAC allowance and never transfers. +#[test] +fn test_has_sufficient_allowance_does_not_transfer() { + let (env, contract_id, token_addr, user, _merchant) = setup(); + let token = TokenClient::new(&env, &token_addr); + let amount: i128 = 1_0000000; + let balance_before = token.balance(&user); + + env.as_contract(&contract_id, || { + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + }); + + token.approve(&user, &contract_id, &0, &200000); + + env.as_contract(&contract_id, || { + assert!(!validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + 0 + )); + }); + + assert_eq!(token.balance(&user), balance_before); +} + +// Note: setter input validation is covered in contract code; invoking it directly +// via the generated client isn't available in these tests. The storage-level +// behavior for routing is covered by the tests above. + +#[test] +fn test_charge_with_zero_fee_bps_skips_fee_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +/// subscribe() must store all Subscription fields exactly as provided. +#[test] +fn test_subscription_struct_fields_match_input() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + let subscribe_time = env.ledger().timestamp(); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + + assert_eq!(sub.merchant, merchant, "merchant should match"); + assert_eq!(sub.amount, amount, "amount should match"); + assert_eq!(sub.interval, interval, "interval should match"); + assert!(sub.active, "subscription should be active"); + assert!(!sub.paused, "subscription should not be paused"); + assert_eq!(sub.token, token_addr, "token should match"); + // last_charged is set to subscribe time when no trial period + assert_eq!( + sub.last_charged, subscribe_time, + "last_charged should be set to subscribe time" + ); +} + +// ───────────────────────────────────────────── +// Issue #194: get_trial_end() tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_trial_end_with_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let now = env.ledger().timestamp(); + let trial_period: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(trial_period), + &None, + ); + + assert_eq!(client.get_trial_end(&user), Some(now + trial_period)); +} + +#[test] +fn test_get_trial_end_without_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_trial_end(&user).is_none()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #6)")] +fn test_charge_before_trial_end_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(86400u64), + &None, + ); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_subscribe_non_whitelisted_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_whitelisted_merchant_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.add_merchant(&merchant); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); + assert!(client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_is_merchant_whitelisted_returns_false_for_non_whitelisted() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_set_whitelist_enabled_false_allows_any_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.set_whitelist_enabled(&false); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); +} + +#[test] +fn test_get_whitelist_enabled_defaults_to_true() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(client.get_whitelist_enabled()); +} + +#[test] +fn test_get_whitelist_enabled_toggles() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Default is true + assert!(client.get_whitelist_enabled()); + + // False after set_whitelist_enabled(false) + client.set_whitelist_enabled(&false); + assert!(!client.get_whitelist_enabled()); + + // True after re-enabling + client.set_whitelist_enabled(&true); + assert!(client.get_whitelist_enabled()); +} + +// ───────────────────────────────────────────── +// Merchant freeze tests +// ───────────────────────────────────────────── + +/// subscribe to a frozen merchant panics with ContractError::MerchantFrozen. +#[test] +#[should_panic(expected = "Error(Contract, #22)")] +fn test_subscribe_to_frozen_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// An existing subscriber can still be charged after their merchant is frozen — +/// freeze only blocks new subscriptions, not existing charge cycles. +#[test] +fn test_charge_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, interval + 1); +} + +/// pay_per_use is unaffected by merchant freeze status for an existing subscriber. +#[test] +fn test_pay_per_use_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 1_0000000); +} + +/// is_merchant_frozen reflects freeze/unfreeze state changes. +#[test] +fn test_is_merchant_frozen_reflects_state() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert!(!client.is_merchant_frozen(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// Freezing a merchant that is not whitelisted must still succeed — the two +/// states (whitelist, freeze) are independent of each other. +#[test] +fn test_freeze_merchant_independent_of_whitelist() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Merchant is not whitelisted at all, and whitelist enforcement is off. + assert!(!client.is_merchant_whitelisted(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +/// freeze_merchant is idempotent — freezing an already-frozen merchant must not panic. +#[test] +fn test_freeze_merchant_idempotent() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); +} + +/// unfreeze_merchant on a non-frozen merchant must not panic. +#[test] +fn test_unfreeze_merchant_non_frozen_is_noop() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_freeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.freeze_merchant(&merchant, &None); +} + +/// unfreeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_unfreeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.unfreeze_merchant(&merchant); +} + +#[test] +#[should_panic] +fn test_non_admin_add_and_remove_merchant_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.add_merchant(&merchant); + client.remove_merchant(&merchant); +} + +// ───────────────────────────────────────────── +// CONTRACT-20: whitelist_batch_add / whitelist_batch_remove tests +// ───────────────────────────────────────────── + +#[test] +fn test_whitelist_batch_add_three_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + merchants.push_back(m3.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 3); + assert!(client.is_merchant_whitelisted(&m1)); + assert!(client.is_merchant_whitelisted(&m2)); + assert!(client.is_merchant_whitelisted(&m3)); +} + +#[test] +fn test_whitelist_batch_remove_two_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + client.add_merchant(&m1); + client.add_merchant(&m2); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 2); + assert!(!client.is_merchant_whitelisted(&m1)); + assert!(!client.is_merchant_whitelisted(&m2)); +} + +#[test] +fn test_whitelist_batch_add_duplicates_does_not_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 2); + assert!(client.is_merchant_whitelisted(&m1)); +} + +#[test] +fn test_whitelist_batch_remove_non_whitelisted_is_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 1); + assert!(!client.is_merchant_whitelisted(&m1)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic] +fn test_whitelist_batch_add_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(merchant.clone()); + client.whitelist_batch_add(&merchants); +} + +// ───────────────────────────────────────────── +// CONTRACT-803: configurable whitelist batch limit +// ───────────────────────────────────────────── + +/// Helper: installs a generated admin so admin-gated entrypoints are callable. +fn install_admin(env: &Env, contract_id: &Address) { + let admin = Address::generate(env); + env.as_contract(contract_id, || { + storage::set_admin(env, &admin); + }); +} + +/// Helper: installs an admin and returns a Vec of `n` freshly generated merchants. +fn whitelist_admin_and_merchants( + env: &Env, + contract_id: &Address, + n: u32, +) -> soroban_sdk::Vec
{ + install_admin(env, contract_id); + + let mut merchants = soroban_sdk::Vec::new(env); + for _ in 0..n { + merchants.push_back(Address::generate(env)); + } + merchants +} + +#[test] +fn test_max_whitelist_batch_size_defaults_to_50() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + assert_eq!(client.get_max_whitelist_batch_size(), 50); + // The whitelist knob is independent of the charge-batch knob. + client.set_max_batch_size(&10); + assert_eq!(client.get_max_whitelist_batch_size(), 50); + assert_eq!(client.get_max_batch_size(), 10); +} + +#[test] +fn test_set_max_whitelist_batch_size_lowers_cap() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + client.set_max_whitelist_batch_size(&2); + assert_eq!(client.get_max_whitelist_batch_size(), 2); + + // Exactly at the configured cap still succeeds. + assert_eq!(client.whitelist_batch_add(&merchants), 2); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_remove_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_remove(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_raised_whitelist_batch_cap_allows_more_than_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 51); + + // 51 entries panic under the default cap; raising the cap admits them. + client.set_max_whitelist_batch_size(&60); + assert_eq!(client.whitelist_batch_add(&merchants), 51); + assert_eq!(client.get_whitelist_size(), 51); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_above_ceiling_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&(MAX_BATCH_SIZE_CEILING + 1)); +} + +#[test] +#[should_panic] +fn test_set_max_whitelist_batch_size_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + client.set_max_whitelist_batch_size(&10); +} + +#[test] +fn test_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_referral_cleared_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.cancel(&user); + + assert_eq!(client.get_referrer(&user), None); +} + +#[test] +#[should_panic] +fn test_charge_too_early() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.charge(&user); +} + +// ───────────────────────────────────────────── +// Multi-token + advanced features +// ───────────────────────────────────────────── + +#[test] +fn test_multi_token_independent_subscriptions() { + let (env, contract_id, token_a, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let token_b = setup_second_token(&env, &contract_id, &user_b); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, &merchant, &amount, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user_b, &merchant, &amount, &interval, &token_b, &None, &None, + ); + + let sub_a = client.get_subscription(&user_a).unwrap(); + let sub_b = client.get_subscription(&user_b).unwrap(); + + assert_eq!(sub_a.token, token_a); + assert_eq!(sub_b.token, token_b); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); + client.charge(&user_b); +} + +#[test] +fn test_user_can_switch_token() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let token_b = setup_second_token(&env, &contract_id, &user); + let interval: u64 = 86400; + + client.subscribe( + &user, &merchant, &1_0000000, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user, &merchant, &2_0000000, &interval, &token_b, &None, &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let token = TokenClient::new(&env, &token_addr); + let before = token.balance(&merchant); + + client.pay_per_use(&user, &5_0000000); + + assert_eq!(token.balance(&merchant), before + 5_0000000); +} + +#[test] +fn test_pay_per_use_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +// ───────────────────────────────────────────── +// CONTRACT-23: pay_per_use_to tests +// ───────────────────────────────────────────── + +#[test] +fn test_pay_per_use_to_transfers_to_recipient_not_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 5_0000000; + let merchant_before = token.balance(&merchant); + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&merchant), merchant_before); + assert_eq!(token.balance(&recipient) - recipient_before, amount); + assert_eq!(client.get_merchant_revenue(&recipient), amount); + assert_eq!(client.get_merchant_revenue(&merchant), 0); +} + +#[test] +fn test_pay_per_use_to_applies_protocol_fee_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let recipient_before = token.balance(&recipient); + let collector_before = token.balance(&collector); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&recipient), expected_net); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_rejects_non_whitelisted_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.add_merchant(&merchant); + client.set_whitelist_enabled(&true); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let recipient = Address::generate(&env); // never whitelisted + client.pay_per_use_to(&user, &1_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + + client.pay_per_use_to(&user, &amount, &merchant); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_daily_limit_shared_with_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + + client.pay_per_use(&user, &6_0000000); + // Combined spend (6 + 6 = 12) exceeds the 10 limit, even though this + // second call routes through pay_per_use_to to a different recipient. + client.pay_per_use_to(&user, &6_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_with_zero_fee_bps_transfers_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pay_per_use(&user, &1_0000000); +} + +/// pay_per_use() must not update last_charged, confirming it is independent of the recurring billing cycle. +#[test] +fn test_pay_per_use_does_not_update_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + let last_charged_before = sub_before.last_charged; + + // Advance ledger time so we can verify last_charged isn't simply matching the current time + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; + }); + + client.pay_per_use(&user, &5_0000000); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.last_charged, last_charged_before, + "pay_per_use should not update last_charged" + ); +} + +#[test] +#[should_panic] +fn test_pay_per_use_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.pay_per_use(&random, &1_0000000); +} + +// ───────────────────────────────────────────── +// Edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_pay_per_use_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_exceeds_cap() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &(MAX_AMOUNT + 1)); +} + +/// initialize() still works for backward compat but is not required. +#[test] +fn test_initialize_backward_compat() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // initialize with a default token — should not affect per-sub token + client.initialize(&token_addr, &admin); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe(&user, &merchant, &1_0000000, &86400, &token_b, &None, &None); + + // Subscription uses token_b, not the initialized default + assert_eq!(client.get_subscription(&user).unwrap().token, token_b); +} + +// ── Issue #14: cancel nonexistent subscription ─────────────────────────────── + +/// cancel() must panic with "no subscription found" when called on a user with no subscription. +#[test] +#[should_panic] +fn test_cancel_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.cancel(&random); +} + +// ── Issue #13: get_subscription for nonexistent subscription ───────────────── + +/// get_subscription() must return None for an address with no subscription. +#[test] +fn test_get_subscription_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription(&random).is_none(), + "get_subscription should return None for unknown address" + ); +} +// ── Issue #12: last_charged timestamp update ───────────────────────────────── + +/// charge() must update last_charged to the current ledger timestamp. +#[test] +fn test_charge_updates_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Record the timestamp before advancing time + let subscribe_time = env.ledger().timestamp(); + + // Advance ledger time past interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; // advance by interval + 1000 seconds + }); + + // Record the timestamp right before charge + let charge_time = env.ledger().timestamp(); + assert!( + charge_time > subscribe_time, + "charge time should be after subscribe time" + ); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + // Verify last_charged is exactly equal to the charge_time + assert_eq!( + sub_after.last_charged, charge_time, + "last_charged should equal the ledger timestamp at charge time" + ); +} + +#[test] +#[should_panic] +fn test_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &0, &86400, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_zero_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_interval_too_short() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &59, &token_addr, &None, &None); +} + +#[test] +fn test_interval_minimum_valid() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +// ───────────────────────────────────────────── +// Multi-user isolation +// ───────────────────────────────────────────── + +#[test] +fn test_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let merchant_b = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount_a: i128 = 1_0000000; + let amount_b: i128 = 2_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant_a, + &amount_a, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant_b, + &amount_b, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); +} + +// ───────────────────────────────────────────── +// Cancel + charge edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_charge_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + client.charge(&user); +} + +// ───────────────────────────────────────────── +// batch_charge tests +// ───────────────────────────────────────────── + +#[test] +fn test_batch_charge_charged_and_skipped() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let interval: u64 = 86400; + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Only advance past interval for user_a + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // user_b re-subscribes at the new timestamp so their interval hasn't elapsed + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); +} + +#[test] +fn test_batch_charge_ordering() { + let (env, contract_id, token_addr, user_1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_2 = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_2, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_2, &contract_id, &10_000_0000000, &200); + + let user_3 = Address::generate(&env); + // user_3 has no subscription + + let user_4 = Address::generate(&env); + sac.mint(&user_4, &10_000_0000000); + token.approve(&user_4, &contract_id, &10_000_0000000, &200); + + let interval = 86400; + + // user_1: valid, will be charged + client.subscribe( + &user_1, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_2: valid, will be charged + client.subscribe( + &user_2, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe( + &user_4, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) + users.push_back(user_2.clone()); + users.push_back(user_3.clone()); + users.push_back(user_4.clone()); + users.push_back(user_1.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); + assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); +} + +#[test] +fn test_batch_charge_no_subscription() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(unknown); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::NoSubscription); +} + +#[test] +#[cfg(feature = "bench")] +fn test_batch_charge_stress() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + env.budget().reset_unlimited(); + + let num_users = 50; + let mut users = soroban_sdk::Vec::new(&env); + let interval = 86400; + + for _ in 0..num_users { + let u = Address::generate(&env); + sac.mint(&u, &10_000_0000000); + token.approve(&u, &contract_id, &10_000_0000000, &200); + client.subscribe( + &u, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), num_users); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } +} + +#[test] +#[cfg(feature = "bench")] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = Address::generate(&env); + users.push_back(u); + users.push_back(Address::generate(&env)); + } + + let res = client.try_batch_charge(&users); + assert!(res.is_err()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_batch_size_rejects_value_above_200() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_max_batch_size(&201); +} + +#[test] +#[should_panic] +fn test_non_admin_set_max_batch_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.set_auths(&[]); + client.set_max_batch_size(&10); +} + +#[test] +fn test_cancel_and_refund_prorated_transfers_expected_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 900; + }); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 7_500_000 + ); + assert_eq!(token.balance(&user), user_balance_before + 7_500_000); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_cancel_and_refund_prorated_at_period_start_refunds_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 1_0000000 + ); + assert_eq!(token.balance(&user), user_balance_before + 1_0000000); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +#[should_panic(expected = "Error(Contract, #39)")] +fn test_cancel_and_refund_prorated_at_interval_end_rejects_zero_refund() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 3600; + }); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #38)")] +fn test_cancel_and_refund_prorated_rejects_wrong_merchant() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let actual_merchant = Address::generate(&env); + + client.subscribe( + &user, + &actual_merchant, + &1_0000000, + &3600, + &_token_addr, + &None, + &None, + ); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_cancel_and_refund_prorated_missing_subscription_panics() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +fn test_cancel_and_refund_prorated_underfunded_merchant_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| l.timestamp = 1800); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert_eq!(token.balance(&merchant), merchant_balance_before); + assert_eq!(token.balance(&user), user_balance_before); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_inactive_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_paused_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(sub.paused); +} + +#[test] +fn test_batch_charge_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Inactive); +} + +/// batch_charge must return ChargeResult::Paused for a subscription that has been paused. +#[test] +fn test_batch_charge_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Paused); +} + +/// Issue #201: batch_charge applies protocol fees identically to charge(). +#[test] +fn test_batch_charge_with_fee() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + let collector = Address::generate(&env); + let fee_bps: u32 = 100; // 1% + client.propose_fee(&collector, &fee_bps); + client.commit_fee(); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 10_000_000; // 1 XLM + let interval: u64 = 86400; + let expected_fee = amount * (fee_bps as i128) / 10_000; + let expected_net = amount - expected_fee; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_a_balance_before = token.balance(&user_a); + let user_b_balance_before = token.balance(&user_b); + let merchant_balance_before = token.balance(&merchant); + let collector_balance_before = token.balance(&collector); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Charged); + + assert_eq!( + user_a_balance_before - token.balance(&user_a), + amount, + "user_a debited gross amount" + ); + assert_eq!( + user_b_balance_before - token.balance(&user_b), + amount, + "user_b debited gross amount" + ); + assert_eq!( + token.balance(&merchant) - merchant_balance_before, + expected_net * 2, + "merchant receives net per user" + ); + assert_eq!( + token.balance(&collector) - collector_balance_before, + expected_fee * 2, + "collector receives fee per user" + ); +} + +#[test] +fn test_batch_charge_grace_period_elapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::GracePeriodElapsed + ); +} + +// ----------------------------------------------------------------- +// Issue #794: batch_charge AllowanceInsufficient tolerance tests +// ----------------------------------------------------------------- + +/// A subscriber with zero allowance receives AllowanceInsufficient; no funds move. +#[test] +fn test_batch_charge_zero_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Revoke the allowance entirely. + token.approve(&user, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "zero allowance must produce AllowanceInsufficient" + ); + assert_eq!(token.balance(&user), user_balance_before, "user balance unchanged"); + assert_eq!(token.balance(&merchant), merchant_balance_before, "merchant balance unchanged"); +} + +/// A subscriber whose allowance is exactly the subscription amount is charged. +#[test] +fn test_batch_charge_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the gross amount. + token.approve(&user, &contract_id, &amount, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::Charged, + "exact allowance must allow the charge" + ); + assert_eq!( + token.balance(&user), + 10_000_0000000 - amount, + "user debited gross amount" + ); +} + +/// A subscriber with allowance one stroop below sub.amount is rejected. +#[test] +fn test_batch_charge_one_below_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to one stroop below gross. + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); +} + +/// Mixed batch: Alice (sufficient) -> Bob (insufficient) -> Charlie (sufficient). +/// Bob's failure must not abort Alice's or Charlie's charges. +#[test] +fn test_batch_charge_mixed_allowance_does_not_abort_healthy_users() { + let (env, contract_id, token_addr, alice, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let bob = Address::generate(&env); + let charlie = Address::generate(&env); + sac.mint(&bob, &10_000_0000000); + sac.mint(&charlie, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&alice, &bob, &charlie] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + // Bob revokes to an insufficient amount. + token.approve(&bob, &contract_id, &(amount / 2), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let alice_before = token.balance(&alice); + let bob_before = token.balance(&bob); + let charlie_before = token.balance(&charlie); + let merchant_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(alice.clone()); + users.push_back(bob.clone()); + users.push_back(charlie.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged, "Alice charged"); + assert_eq!( + results.get(1).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "Bob insufficient" + ); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged, "Charlie charged"); + + assert_eq!(alice_before - token.balance(&alice), amount, "Alice debited"); + assert_eq!(token.balance(&bob), bob_before, "Bob untouched"); + assert_eq!(charlie_before - token.balance(&charlie), amount, "Charlie debited"); + assert_eq!( + token.balance(&merchant) - merchant_before, + amount * 2, + "merchant received exactly 2 charges" + ); +} + +/// Multiple under-allowanced users in one batch all return AllowanceInsufficient. +#[test] +fn test_batch_charge_multiple_insufficient_allowances() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let user_b = Address::generate(&env); + sac.mint(&user_b, &10_000_0000000); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + + for u in [&user_a, &user_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(u, &contract_id, &(amount - 1), &200); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let a_before = token.balance(&user_a); + let b_before = token.balance(&user_b); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(token.balance(&user_a), a_before); + assert_eq!(token.balance(&user_b), b_before); +} + +/// Healthy user before AND after an under-allowanced user both get charged. +#[test] +fn test_batch_charge_healthy_before_and_after_insufficient() { + let (env, contract_id, token_addr, healthy_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let insufficient = Address::generate(&env); + let healthy_b = Address::generate(&env); + sac.mint(&insufficient, &10_000_0000000); + sac.mint(&healthy_b, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&healthy_a, &insufficient, &healthy_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + token.approve(&insufficient, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let ha_before = token.balance(&healthy_a); + let hb_before = token.balance(&healthy_b); + let ins_before = token.balance(&insufficient); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(healthy_a.clone()); + users.push_back(insufficient.clone()); + users.push_back(healthy_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged); + + assert_eq!(ha_before - token.balance(&healthy_a), amount); + assert_eq!(token.balance(&insufficient), ins_before); + assert_eq!(hb_before - token.balance(&healthy_b), amount); +} + +/// Auto-resume + insufficient allowance: subscription resumes but charge fails cleanly. +#[test] +fn test_batch_charge_auto_resume_with_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + client.pause_until(&user, &90_000); + + // Revoke allowance while paused. + token.approve(&user, &contract_id, &0, &200); + + // Advance past both the pause expiry and the charge interval. + env.ledger().set_timestamp(90_001); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "auto-resume + zero allowance must not panic" + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(!sub.paused); +} + +/// get_batch_charge_estimate returns AllowanceInsufficient for an under-allowanced +/// due subscriber, mirroring the live batch behavior. +#[test] +fn test_batch_charge_estimate_reflects_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::AllowanceInsufficient + ); +} + +/// Allowance check is against gross sub.amount, NOT the post-fee net amount. +/// Allowance == net (< gross) must still return AllowanceInsufficient. +#[test] +fn test_batch_charge_allowance_checked_against_gross_not_net() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let admin = Address::generate(&env); + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + crate::storage::set_admin(&env, &admin); + }); + // 10% fee: net = 90% of gross. + client.propose_fee(&collector, &1000); + client.commit_fee(); + + let gross: i128 = 1_0000000; + let net: i128 = gross - gross * 1000 / 10_000; // 9_000_000 + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &gross, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the net amount -- below gross. + token.approve(&user, &contract_id, &net, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "allowance == net but < gross must still fail" + ); + assert_eq!(token.balance(&user), user_balance_before, "no funds moved"); +} + +// ───────────────────────────────────────────── +// subscription_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_active_count_increments_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_active_count(), 0); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); +} + +#[test] +fn test_active_count_does_not_double_count_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_active_count_decrements_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + client.cancel(&user); + assert_eq!(client.get_active_count(), 0); +} + +#[test] +fn test_active_count_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 2); + + client.cancel(&user_a); + assert_eq!(client.get_active_count(), 1); +} + +// ───────────────────────────────────────────── +// merchant_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_from_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_merchant_revenue(&merchant), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +fn test_merchant_revenue_from_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &3_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +#[test] +fn test_merchant_revenue_accumulates() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +// ───────────────────────────────────────────── +// spending_limit tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_daily_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Initial limit should be None + assert_eq!(client.get_daily_limit(&user), None); + + // After setting, it should return Some(limit) + client.set_daily_limit(&user, &10_0000000); + assert_eq!(client.get_daily_limit(&user), Some(10_0000000)); +} + +#[test] +fn test_get_daily_limit_status_absent_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: None, + spent: 0, + day_start: None, + remaining: None, + } + ); +} + +#[test] +fn test_get_daily_limit_status_snapshot_and_rollover() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + client.pay_per_use(&user, &2_0000000); + + let status = client.get_daily_limit_status(&user); + assert_eq!(status.limit, Some(10_0000000)); + assert_eq!(status.spent, 2_0000000); + assert_eq!(status.remaining, Some(8_0000000)); + assert_eq!(status.day_start, client.get_day_start(&user)); + + env.as_contract(&contract_id, || { + env.storage().temporary().extend_ttl( + &DataKey::DailyLimit(user.clone()), + 35000, + 35000, + ); + }); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += 17281; + }); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: Some(10_0000000), + spent: 0, + day_start: None, + remaining: Some(10_0000000), + } + ); +} + +#[test] +fn test_daily_limit_allows_spend_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + // Should not panic + client.pay_per_use(&user, &5_0000000); +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &5_0000000); +} + +#[test] +fn test_daily_limit_accumulates_across_calls() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &2_0000000); + client.pay_per_use(&user, &2_0000000); + // 4 total, limit is 5 — should pass +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_cumulative_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &3_0000000); + client.pay_per_use(&user, &3_0000000); // 6 total > 5 limit +} + +#[test] +fn test_daily_limit_visibility_and_spend_tracking() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_daily_limit(&user), None); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &4_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); + + client.pay_per_use(&user, &1_0000000); + assert_eq!(client.get_daily_spent(&user), 1_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); +} + +#[test] +fn test_get_day_start_visibility() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // No window before any spend + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &10_0000000); + // Setting a limit alone does not open the day window + assert!(client.get_day_start(&user).is_none()); + + client.pay_per_use(&user, &2_0000000); + assert!(client.get_day_start(&user).is_some()); + assert_eq!(client.get_daily_spent(&user), 2_0000000); + + client.remove_daily_limit(&user); + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); +} + +#[test] +fn test_daily_limit_set_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let limit: i128 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "daily_limit_set")); + assert_eq!(topic_user, user); + assert_eq!(limit, 4_0000000); +} + +#[test] +fn test_daily_limit_removed_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + client.remove_daily_limit(&user); + + assert_eq!(client.get_daily_limit(&user), None); + assert_last_user_event(&env, "daily_limit_removed", &user); +} + +#[test] +fn test_remove_daily_limit_allows_pay_per_use_after_removal() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &2_0000000); + client.remove_daily_limit(&user); + client.pay_per_use(&user, &2_0000000); // should succeed after removal +} + +// ───────────────────────────────────────────── +// Contract admin event tests +// ───────────────────────────────────────────── + +#[test] +fn test_contract_pause_events_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.pause_contract(); + assert!(client.is_contract_paused()); + assert_last_event(&env, "contract_paused"); + + client.unpause_contract(); + assert!(!client.is_contract_paused()); + assert_last_event(&env, "contract_unpaused"); +} + +// ───────────────────────────────────────────── +// Migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_v1_to_v2() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Manually construct and store a V1 subscription + let v1_sub = crate::migration::SubscriptionV1 { + merchant: merchant.clone(), + amount: 1_0000000, + interval: 86400, + last_charged: env.ledger().timestamp(), + active: true, + token: token_addr.clone(), + referrer: None, + label: Symbol::new(&env, "v1_label"), + trial_duration: 0, + }; + + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&crate::DataKey::Subscription(user.clone()), &v1_sub); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + // Verify it was upgraded to V2 + let v2_sub = client.get_subscription(&user).unwrap(); + assert_eq!(v2_sub.merchant, merchant); + assert_eq!(v2_sub.amount, 1_0000000); + assert_eq!(v2_sub.active, true); + assert_eq!(v2_sub.paused, false); // This is the newly added field + assert_eq!(v2_sub.label, Symbol::new(&env, "v1_label")); +} + +#[test] +fn test_admin_batch_pause_subscriptions_freezes_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 1); +} + +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + + let mut users = Vec::new(&env); + users.push_back(missing_user.clone()); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert!(client.get_subscription(&missing_user).is_none()); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let mut users = Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_upgrade_event_emitted() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[7; 32]); + client.upgrade(&new_wasm_hash); + + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let mock_wasm_hash = BytesN::from_array(&env, &[0u8; 32]); + env.as_contract(&contract_id, || { + events::publish_upgraded(&env, &mock_wasm_hash); + }); + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "upgrade")); +} + +// ───────────────────────────────────────────────────────────── +// Issue #45: get_pending_upgrade tests +// ───────────────────────────────────────────────────────────── + +/// Returns None when no upgrade has been proposed. +#[test] +fn test_get_pending_upgrade_none_when_not_proposed() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert_eq!(client.get_pending_upgrade(), None); +} + +/// Returns the proposed WASM hash after propose_upgrade is called. +#[test] +fn test_get_pending_upgrade_returns_proposed_hash() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xAB; 32]); + client.propose_upgrade(&new_wasm_hash); + + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); +} + +/// Returns None after commit_upgrade consumes the pending hash. +#[test] +fn test_get_pending_upgrade_none_after_commit() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xCD; 32]); + client.propose_upgrade(&new_wasm_hash); + + // Hash is visible before commit + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); + + client.commit_upgrade(); + + // Cleared after commit + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_cancel_pending_upgrade_clears_pending_upgrade_and_emits_event() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xEF; 32]); + client.propose_upgrade(&new_wasm_hash); + client.cancel_pending_upgrade(); + + assert_eq!(client.get_pending_upgrade(), None); + assert_last_event(&env, "upg_cancelled"); +} + +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_upgrade_requires_pending_upgrade_after_cancel() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + client.cancel_pending_upgrade(); + client.commit_upgrade(); +} + +#[test] +fn test_pending_upgrade_expires() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS + 1; + }); + + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_repropose_refreshes_pending_upgrade_ttl() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let first_hash = BytesN::from_array(&env, &[0x01; 32]); + let second_hash = BytesN::from_array(&env, &[0x02; 32]); + client.propose_upgrade(&first_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + client.propose_upgrade(&second_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + + assert_eq!(client.get_pending_upgrade(), Some(second_hash)); +} + +/// A second propose_upgrade overwrites the first pending hash. +#[test] +fn test_get_pending_upgrade_overwritten_by_second_proposal() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let hash_a = BytesN::from_array(&env, &[0x01; 32]); + let hash_b = BytesN::from_array(&env, &[0x02; 32]); + + client.propose_upgrade(&hash_a); + assert_eq!(client.get_pending_upgrade(), Some(hash_a)); + + client.propose_upgrade(&hash_b); + assert_eq!(client.get_pending_upgrade(), Some(hash_b)); +} +// ───────────────────────────────────────────── +// ───────────────────────────────────────────────────────────── +// Issue #96: referral tracking tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_referral_stored_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + assert_eq!(client.get_referrer(&user), Some(referrer)); +} + +#[test] +fn test_no_referral_returns_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_referral_updates_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer_a = Address::generate(&env); + let referrer_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer_a.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_a)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &Some(referrer_b.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_b)); +} + +#[test] +fn test_grace_period_ttl_extension() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Ensure an admin is set so admin checks pass. + let admin = Address::generate(&env); + // Write admin as the contract to set instance storage from the test harness. + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + // Set a grace period as admin and verify read returns the same value. + let seconds: u64 = 3600; + client.propose_grace_period(&seconds); + client.commit_grace_period(); + let got = client.get_grace_period(); + assert_eq!(got, seconds); +} + +#[test] +#[should_panic(expected = "Error(Contract, #1)")] +fn test_double_initialize() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.initialize(&token_addr, &admin); +} + +// ───────────────────────────────────────────── +// Issue #839 / Issue 044: deploy-facing initialize invariants +// Relied on by scripts/deploy-pipeline.ts and scripts/testnet-setup.ts. +// Signature must remain initialize(token, admin). Failures that scripts map +// must be ContractError (AlreadyInitialized = 1), not a host string panic. +// ───────────────────────────────────────────── + +/// Successful initialize persists both the default token and the admin. +/// Deploy health checks require `token_configured` and `admin_configured`. +#[test] +fn test_initialize_deploy_invariant_persists_token_and_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + assert_eq!( + client.get_token(), + Some(token_addr.clone()), + "initialize must persist the token readable via get_token" + ); + assert_eq!( + client.get_admin(), + Some(admin.clone()), + "initialize must persist the admin readable via get_admin" + ); + + let report = client.contract_health_check(); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +/// Storage read used by deploy scripts: get_admin returns the initialized admin. +#[test] +fn test_initialize_deploy_invariant_stored_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Storage read used by deploy scripts: get_token returns the initialized token. +#[test] +fn test_initialize_deploy_invariant_stored_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_token().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +/// A second initialize must return typed AlreadyInitialized (code 1), not a string panic. +#[test] +fn test_initialize_deploy_invariant_double_init_already_initialized() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + let result = client.try_initialize(&token_addr, &admin); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "double initialize must map to ContractError::AlreadyInitialized" + ); + + // First initialize state is unchanged. + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Initialize without admin authorization must fail and must not persist token or admin. +#[test] +fn test_initialize_deploy_invariant_requires_admin_auth() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_initialize(&token_addr, &admin); + assert!(result.is_err(), "initialize without admin auth must fail"); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "missing admin auth is an authorization failure, not AlreadyInitialized" + ); + + assert!( + client.get_token().is_none(), + "failed initialize must not persist token" + ); + assert!( + client.get_admin().is_none(), + "failed initialize must not persist admin" + ); +} + +/// Backward-compat: current initialize(token, admin) arity remains the deploy entrypoint. +#[test] +fn test_initialize_deploy_invariant_token_admin_signature() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +#[test] +fn test_referral_clears_on_resubscribe_with_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_self_referral_rejected_via_try_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(user.clone()), + ); + + assert_eq!(result, Err(Ok(soroban_sdk::Error::from_contract_error(11)))); +} + +// ───────────────────────────────────────────── +// Issue #97: migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_sets_schema_version() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Before migration, version defaults to 0 + assert_eq!(client.get_schema_version(), 0); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +fn test_migrate_is_idempotent() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + client.migrate(&empty_users); // second call should be a no-op + + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────── +#[test] +#[should_panic] +fn test_migrate_non_admin_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); +} + +#[test] +fn test_migrate_emits_completed_event_with_version_and_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (version, user_count): (u32, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "migration_completed")); + assert_eq!(version, 3); + assert_eq!(user_count, 1); +} + +// ───────────────────────────────────────────── +// Issue #99: subscription metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_set_and_get_metadata() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +fn test_clear_metadata_removes_label() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + assert_eq!(client.get_metadata(&user), Some(label)); + + client.clear_metadata(&user); + + assert!(client.get_metadata(&user).is_none()); +} + +#[test] +fn test_get_metadata_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.get_metadata(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Issue #98: charge history tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_charge_history_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. A fresh user with no subscription/no charges ever → count is 0. + let fresh_user = Address::generate(&env); + assert_eq!(client.get_charge_history_count(&fresh_user), 0); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Also checking count for user with active subscription but no charges yet + assert_eq!(client.get_charge_history_count(&user), 0); + + // 2. Count increments by 1 correctly after each individual charge event. + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 1); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 2); + + // Charge more to get exactly 12 entries + for _ in 0..10 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + // 5. (Edge case) A user with exactly 12 entries → returns exactly 12. + assert_eq!(client.get_charge_history_count(&user), 12); + + // 3. Count caps at 12 and does not exceed it even after more than 12 charges have occurred. + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + assert_eq!(client.get_charge_history_count(&user), 12); + + // 4. After calling clear_charge_history for a user who had history, count returns to 0. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.clear_charge_history(&user); + assert_eq!(client.get_charge_history_count(&user), 0); +} + +#[test] +fn test_charge_history_recorded() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_charge_history(&user).len(), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); +} + +#[test] +fn test_charge_history_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Perform 14 charges + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + assert_eq!(client.get_charge_history(&user).len(), 12); +} + +#[test] +fn test_get_charge_history_three_charges_ascending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let history = client.get_charge_history(&user); + assert_eq!(history.len(), 3); + assert_eq!(history.get(0).unwrap(), t1); + assert_eq!(history.get(1).unwrap(), t2); + assert_eq!(history.get(2).unwrap(), t3); +} + +#[test] +fn test_get_charge_history_page_offset_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let page = client.get_charge_history_page(&user, &1u32, &2u32, &true); + assert_eq!(page.len(), 2); + assert_eq!(page.get(0).unwrap(), t2); + assert_eq!(page.get(1).unwrap(), t3); +} + +#[test] +#[should_panic] +fn test_clear_charge_history_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + client.clear_charge_history(&user); +} + +#[test] +fn test_clear_charge_history_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); + + client.clear_charge_history(&user); + + assert_eq!(client.get_charge_history(&user).len(), 0); +} + +#[test] +fn test_get_charge_history_empty_for_no_history() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + let history = client.get_charge_history(&random); + assert_eq!(history.len(), 0); +} + +#[test] +fn test_get_charge_history_page_limit_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + let page = client.get_charge_history_page(&user, &0u32, &100u32, &true); + assert_eq!(page.len(), 12); +} + +#[test] +fn test_get_charge_history_page_offset_beyond_length() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let page = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(page.len(), 0); +} + +#[test] +fn test_charge_history_sort_ascending_and_descending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut timestamps = Vec::new(&env); + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + timestamps.push_back(env.ledger().timestamp()); + } + + let t0 = timestamps.get(0).unwrap(); + let t1 = timestamps.get(1).unwrap(); + let t2 = timestamps.get(2).unwrap(); + let t3 = timestamps.get(3).unwrap(); + let t4 = timestamps.get(4).unwrap(); + + // Ascending (true) full page: [t0, t1, t2, t3, t4] + let asc_all = client.get_charge_history_page(&user, &0u32, &10u32, &true); + assert_eq!(asc_all.len(), 5); + assert_eq!(asc_all.get(0).unwrap(), t0); + assert_eq!(asc_all.get(1).unwrap(), t1); + assert_eq!(asc_all.get(2).unwrap(), t2); + assert_eq!(asc_all.get(3).unwrap(), t3); + assert_eq!(asc_all.get(4).unwrap(), t4); + + // Descending (false) full page: [t4, t3, t2, t1, t0] + let desc_all = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(desc_all.len(), 5); + assert_eq!(desc_all.get(0).unwrap(), t4); + assert_eq!(desc_all.get(1).unwrap(), t3); + assert_eq!(desc_all.get(2).unwrap(), t2); + assert_eq!(desc_all.get(3).unwrap(), t1); + assert_eq!(desc_all.get(4).unwrap(), t0); + + // Pagination in ascending direction: + let asc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &true); + assert_eq!(asc_p1.len(), 2); + assert_eq!(asc_p1.get(0).unwrap(), t0); + assert_eq!(asc_p1.get(1).unwrap(), t1); + + let asc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &true); + assert_eq!(asc_p2.len(), 2); + assert_eq!(asc_p2.get(0).unwrap(), t2); + assert_eq!(asc_p2.get(1).unwrap(), t3); + + let asc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &true); + assert_eq!(asc_p3.len(), 1); + assert_eq!(asc_p3.get(0).unwrap(), t4); + + let asc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(asc_p4.len(), 0); + + // Pagination in descending direction: + let desc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &false); + assert_eq!(desc_p1.len(), 2); + assert_eq!(desc_p1.get(0).unwrap(), t4); + assert_eq!(desc_p1.get(1).unwrap(), t3); + + let desc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &false); + assert_eq!(desc_p2.len(), 2); + assert_eq!(desc_p2.get(0).unwrap(), t2); + assert_eq!(desc_p2.get(1).unwrap(), t1); + + let desc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &false); + assert_eq!(desc_p3.len(), 1); + assert_eq!(desc_p3.get(0).unwrap(), t0); + + let desc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &false); + assert_eq!(desc_p4.len(), 0); +} + +#[test] +fn test_charge_history_sort_edge_cases() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + // Empty history + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &true) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &false) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &5u32, &10u32, &false) + .len(), + 0 + ); + + // Single entry + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t0 = env.ledger().timestamp(); + + let asc_single = client.get_charge_history_page(&user, &0u32, &10u32, &true); + let desc_single = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(asc_single.len(), 1); + assert_eq!(desc_single.len(), 1); + assert_eq!(asc_single.get(0).unwrap(), t0); + assert_eq!(desc_single.get(0).unwrap(), t0); +} + +#[test] +fn test_clear_charge_history_nonexistent_key_no_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.clear_charge_history(&random); +} + +// ───────────────────────────────────────────── +// contract_health_check tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_initialized_unpaused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!( + report.is_healthy, + "initialized and unpaused contract should be healthy" + ); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +#[test] +fn test_health_check_paused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy, "paused contract should not be healthy"); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_pre_initialize() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!( + !report.token_configured, + "token should not be configured before initialize" + ); + assert!( + !report.is_healthy, + "uninitialized contract should not be healthy" + ); +} + +#[test] +fn test_health_check_active_subscription_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let report = client.contract_health_check(); + assert_eq!(report.active_subscription_count, 1); +} + +// ───────────────────────────────────────────── +// Issue 010: HealthReport field cleanup tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_healthy_fully_configured() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!(report.is_healthy); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); + assert!(report.instance_ttl_ledgers > 0); + // pending_merchant_rev_count is 0 when no merchants have revenue + assert_eq!(report.pending_merchant_rev_count, 0); +} + +#[test] +fn test_health_check_paused_not_healthy() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_unconfigured_not_healthy() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(!report.token_configured); + assert!(!report.admin_configured); +} + +/// Verify that TTL is reported as a positive value (test builds use real get_ttl). +#[test] +fn test_health_check_ttl_is_positive() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + assert!( + report.instance_ttl_ledgers > 0, + "instance_ttl_ledgers should be positive in test builds" + ); +} + +#[test] +fn test_ttl_extension() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // We can't easily assert the exact TTL in the test environment without more complex mock_all_auths + // or internal access, but we can verify the function exists and doesn't panic. + + // Keep the contract instance itself alive across the jump below — only the + // Subscription entry's TTL is extended by extend_subscription_ttl, but the + // contract instance needs its own TTL or the whole contract becomes archived. + // Extend a bit past SUBSCRIPTION_TTL_LEDGERS to cover the two ledger jumps below. + env.as_contract(&contract_id, || { + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS + 10, SUBSCRIPTION_TTL_LEDGERS + 10); + }); + + env.ledger().with_mut(|l| { + l.sequence_number += SUBSCRIPTION_TTL_LEDGERS - 1; + }); + + client.extend_subscription_ttl(&user); + + assert!(client.get_subscription(&user).is_some()); +} + +// ───────────────────────────────────────────── +// Issue 013: PauseExpiry TTL coupled with subscription bump +// ───────────────────────────────────────────── + +#[test] +fn test_bump_subscription_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Verify PauseExpiry exists before bump + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should exist after pause_until"); + }); + + // Bump subscription TTL — should also bump PauseExpiry + client.bump_subscription(&user); + + // PauseExpiry should still exist (not archived) + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive bump_subscription"); + assert_eq!(expiry.unwrap(), 90000); + }); +} + +#[test] +fn test_bump_subscription_no_op_on_absent_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // No PauseExpiry — bump should be a safe no-op + client.bump_subscription(&user); + + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(expiry, None, "PauseExpiry should remain absent"); + }); +} + +#[test] +fn test_batch_extend_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &200000); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // PauseExpiry should survive batch extend + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive batch_extend"); + assert_eq!(expiry.unwrap(), 200000); + }); +} + +#[test] +fn test_pause_then_batch_extend_then_auto_resume() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Batch extend keeps PauseExpiry alive + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // Advance to expiry — auto-resume should still work + env.ledger().set_timestamp(90000); + let mut users2 = soroban_sdk::Vec::new(&env); + users2.push_back(user.clone()); + let result = client.batch_charge(&users2); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); +} + +// ───────────────────────────────────────────── +// CONTRACT-22: bump_instance_ttl tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_extends_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS / 2); +} + +#[test] +fn test_initialize_sets_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin); + let admin = Address::generate(&env); + + client.initialize(&token_id.address(), &admin); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl > 0); +} + +#[test] +fn test_bump_instance_ttl_is_permissionless_and_state_preserving() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + env.ledger().with_mut(|ledger| { + ledger.max_entry_ttl = SUBSCRIPTION_TTL_LEDGERS * 2; + }); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let admin_before = client.get_admin(); + let token_before = client.get_token(); + let fee_before = client.get_fee(); + let subscription_before = client.get_subscription(&user); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += SUBSCRIPTION_TTL_LEDGERS / 2 + 100; + }); + let ttl_before = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + + env.set_auths(&[]); + client.bump_instance_ttl(); + + let ttl_after = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl_after > ttl_before); + assert!(ttl_after >= SUBSCRIPTION_TTL_LEDGERS); + assert_eq!(client.get_admin(), admin_before); + assert_eq!(client.get_token(), token_before); + assert_eq!(client.get_fee(), fee_before); + assert_eq!(client.get_subscription(&user), subscription_before); + + client.bump_instance_ttl(); + let repeated_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(repeated_ttl >= ttl_after); +} + +#[test] +#[should_panic] +fn test_subscribe_interval_under_60_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +fn test_subscribe_interval_minimum_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +#[test] +#[should_panic(expected = "Error(Contract, #15)")] +fn test_subscribe_amount_above_cap_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &(MAX_SUBSCRIPTION_AMOUNT + 1)); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &(MAX_SUBSCRIPTION_AMOUNT + 1), &200); + + client.subscribe( + &user, + &merchant, + &(MAX_SUBSCRIPTION_AMOUNT + 1), + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_amount_at_cap_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &MAX_SUBSCRIPTION_AMOUNT); + let token = soroban_sdk::token::Client::new(&env, &token_addr); + token.approve(&user, &contract_id, &MAX_SUBSCRIPTION_AMOUNT, &200); + + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, MAX_SUBSCRIPTION_AMOUNT); +} + +// ───────────────────────────────────────────── +// Admin transfer tests +// ───────────────────────────────────────────── + +#[test] +fn test_transfer_admin() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + // Step 1: propose + client.transfer_admin(&new_admin); + // Step 2: accept + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_transfer_admin_event_emitted() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_old_admin, emitted_new_admin): (Address, Address) = + data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "admin_transferred")); + assert_eq!(emitted_old_admin, old_admin); + assert_eq!(emitted_new_admin, new_admin); +} + +#[test] +fn test_transfer_admin_requires_auth() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_old_admin_loses_access_after_transfer() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_ne!(current_admin, old_admin); +} + +#[test] +#[should_panic] +fn test_accept_admin_without_proposal_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.accept_admin(); +} + +#[test] +fn test_initialize_without_valid_token() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + // Using a user address instead of a token contract address. + // The contract currently does not validate if the address is a valid token contract + // or even if it's a contract at all. + let invalid_token = Address::generate(&env); + let admin = Address::generate(&env); + + client.initialize(&invalid_token, &admin); + + // Success means it didn't panic, which is the current expected behavior. +} + +// ───────────────────────────────────────────── +// Global volume cap tests +// ───────────────────────────────────────────── + +/// Helper: set up a user with a large balance for global volume testing +fn setup_large_balance(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &100_000_000_000_000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &100_000_000_000_000, &200000); + user +} + +#[test] +fn test_global_volume_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; // well under limit + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + // Should succeed - well under the 50 trillion stroops limit +} + +#[test] +#[should_panic] +fn test_global_volume_exceeds_limit() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Give users large balances to exceed the 50_000_000_000_000 limit + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 30_000_000_000_000; // 30 trillion stroops each + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // First charge succeeds (30 trillion used) + client.charge(&user_a); + + // Second charge should panic (60 trillion total > 50 trillion limit) + client.charge(&user_b); +} + +#[test] +fn test_global_volume_window_reset() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; // well under MAX_AMOUNT + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); // 5 trillion used this window + + // Advance time past the 1-hour window boundary (3601 seconds) + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + + // This charge should succeed because the window has reset + client.charge(&user_b); +} + +// ───────────────────────────────────────────── +// Issue #10: get_global_volume_window tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_global_volume_window_returns_zero_on_fresh_contract() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, 0, "accumulated volume should be 0 on fresh contract"); + assert_eq!(window_start, 0, "window start should be 0 on fresh contract"); +} + +#[test] +fn test_get_global_volume_window_correct_values_after_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let charge_time = env.ledger().timestamp(); + client.charge(&user); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, amount, "accumulated volume should equal the charged amount"); + assert_eq!(window_start, charge_time, "window_start should equal ledger timestamp at charge time"); +} + +#[test] +fn test_get_global_volume_window_resets_after_hour() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe(&user_a, &merchant, &amount, &interval, &token_addr, &None, &None); + client.subscribe(&user_b, &merchant, &amount, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); + + // Confirm volume accumulated in the first window + let (volume_before, _) = client.get_global_volume_window(); + assert_eq!(volume_before, amount); + + // Advance past the 1-hour window boundary + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + let second_charge_time = env.ledger().timestamp(); + client.charge(&user_b); + + // Window should have reset: only the second charge amount is accumulated + let (volume_after, window_start_after) = client.get_global_volume_window(); + assert_eq!(volume_after, amount, "volume should reset to just the new charge amount after window expiry"); + assert_eq!(window_start_after, second_charge_time, "window_start should be the new charge time after reset"); +} + + + +// ───────────────────────────────────────────── +// subscribe_with_metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_with_metadata_success() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let label = soroban_sdk::String::from_str(&env, "Pro Plan"); + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &label, + ); + + // Verify subscription is created + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + + // Verify metadata is set + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_label_too_long() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create a 65-byte label (exceeds 64-byte limit) + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", // 65 chars + ); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Should panic with MetadataLabelTooLong + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &long_label, + ); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_no_subscription_on_label_failure() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", + ); + + // Label validation happens before subscribe_inner, so no subscription should be written. + // This panics before any storage write — we verify that by catching the panic separately + // in test_subscribe_with_metadata_label_too_long. Here we just assert the panic occurs. + client.subscribe_with_metadata( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + &long_label, + ); +} + +// ───────────────────────────────────────────── +// get_protocol_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_protocol_stats_initial() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let stats = client.get_protocol_stats(); + + assert_eq!(stats.active_count, 0); + assert_eq!(stats.fee_bps, 0); + assert!(stats.fee_collector.is_none()); + assert_eq!(stats.grace_period, 0); + assert!(!stats.whitelist_enabled); + assert_eq!(stats.schema_version, 0); // default unmigrated version + assert!(!stats.contract_paused); +} + +#[test] +fn test_get_protocol_stats_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.active_count, 1); +} + +#[test] +fn test_get_protocol_stats_with_fee() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + let fee_collector = Address::generate(&env); + client.propose_fee(&fee_collector, &100); // 1% fee + client.commit_fee(); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.fee_bps, 100); + assert_eq!(stats.fee_collector, Some(fee_collector)); +} + +#[test] +fn test_get_protocol_stats_contract_paused() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + client.pause_contract(); + + let stats = client.get_protocol_stats(); + assert!(stats.contract_paused); + + client.unpause_contract(); + let stats_after = client.get_protocol_stats(); + assert!(!stats_after.contract_paused); +} + +#[test] +fn test_resubscribe() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + // Initial subscription + client.subscribe( + &user, + &merchant_a, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sub1 = client.get_subscription(&user).unwrap(); + assert_eq!(sub1.merchant, merchant_a); + assert_eq!(sub1.amount, 1_0000000); + + // Subscribe again with different parameters + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + let sub2 = client.get_subscription(&user).unwrap(); + + assert_eq!(sub2.merchant, merchant_b); + assert_eq!(sub2.amount, 2_0000000); + assert_eq!(sub2.interval, 172800); + + // Verify old merchant is gone + assert_ne!(sub2.merchant, merchant_a); +} + +#[test] +fn test_subscribe_overwrites_cancelled_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. Cancel + client.cancel(&user); + let sub_cancelled = client.get_subscription(&user).unwrap(); + assert!(!sub_cancelled.active); + + // 3. Subscribe again + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + + // 4. Verify new subscription is active + let sub_new = client.get_subscription(&user).unwrap(); + assert!(sub_new.active); + assert_eq!(sub_new.amount, 2_0000000); +} + +// ───────────────────────────────────────────── +// min_interval tests +// ───────────────────────────────────────────── + +/// get_min_interval returns 3600 (1 hour) before any admin configuration. +#[test] +fn test_get_min_interval_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_min_interval(), 3600); +} + +#[test] +fn test_min_interval_event_emitted_on_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Verify default value is 3600 before setting + assert_eq!(client.get_min_interval(), 3600); + + // First set: old value should be 3600 default, new value 7200 + client.set_min_interval(&7200u64); + assert_eq!(client.get_min_interval(), 7200); + + let events_vec = env.events().all(); + let (_, topics, data) = events_vec.get(events_vec.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "min_interval_set")); + + let event_data: events::MinIntervalSetEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.old, 3600); + assert_eq!(event_data.new, 7200); + + // Second set: old value 7200, new value 86400 + client.set_min_interval(&86400u64); + assert_eq!(client.get_min_interval(), 86400); + + let events_vec2 = env.events().all(); + let (_, topics2, data2) = events_vec2.get(events_vec2.len() - 1).unwrap(); + let topic_symbol2: Symbol = topics2.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol2, Symbol::new(&env, "min_interval_set")); + + let event_data2: events::MinIntervalSetEventData = data2.try_into_val(&env).unwrap(); + assert_eq!(event_data2.old, 7200); + assert_eq!(event_data2.new, 86400); + + // Same value set again: old == 86400, new == 86400 + client.set_min_interval(&86400u64); + let events_vec3 = env.events().all(); + let (_, topics3, data3) = events_vec3.get(events_vec3.len() - 1).unwrap(); + let topic_symbol3: Symbol = topics3.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol3, Symbol::new(&env, "min_interval_set")); + + let event_data3: events::MinIntervalSetEventData = data3.try_into_val(&env).unwrap(); + assert_eq!(event_data3.old, 86400); + assert_eq!(event_data3.new, 86400); +} + +#[test] +fn test_top_merchants_by_subs() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Create subscriptions for m1 (1 sub), m2 (3 subs), m3 (2 subs) + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + let u3 = setup_funded_user(&env, &contract_id, &token_addr); + let u4 = setup_funded_user(&env, &contract_id, &token_addr); + let u5 = setup_funded_user(&env, &contract_id, &token_addr); + let u6 = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u3, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u4, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u5, &m3, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u6, &m3, &1_0000000, &86400, &token_addr, &None, &None); + + // Top 3 merchants: m2 (3 subs), m3 (2 subs), m1 (1 sub) + let top = client.get_top_merchants_by_subs(&3u32); + assert_eq!(top.len(), 3); + assert_eq!(top.get(0).unwrap(), (m2.clone(), 3u32)); + assert_eq!(top.get(1).unwrap(), (m3.clone(), 2u32)); + assert_eq!(top.get(2).unwrap(), (m1.clone(), 1u32)); + + // Unknown / unindexed merchant returns 0 for subscriber count query + let unindexed = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unindexed), 0); +} + +#[test] +fn test_top_merchants_tie_breaking_and_limit() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + + // Add m1 first, then m2 + client.add_merchant(&m1); + client.add_merchant(&m2); + + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + + // Both m1 and m2 get 1 sub (tie) + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + // Tie-breaking preserves index order: m1 first, m2 second + let top = client.get_top_merchants_by_subs(&2u32); + assert_eq!(top.len(), 2); + assert_eq!(top.get(0).unwrap(), (m1.clone(), 1u32)); + assert_eq!(top.get(1).unwrap(), (m2.clone(), 1u32)); + + // Limit 1 returns top 1 + let top1 = client.get_top_merchants_by_subs(&1u32); + assert_eq!(top1.len(), 1); + assert_eq!(top1.get(0).unwrap(), (m1.clone(), 1u32)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_top_merchants_limit_exceeded_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.get_top_merchants_by_subs(&21u32); +} + +/// subscribe panics with IntervalTooShort when interval < default floor of 3600. +#[test] +#[should_panic] +fn test_subscribe_interval_too_short_panics_default_floor() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // 1800 seconds (30 min) < 3600 default floor + client.subscribe( + &user, + &merchant, + &1_0000000, + &1800, + &token_addr, + &None, + &None, + ); +} + +/// Lowering the floor via set_min_interval then subscribing at the new floor succeeds. +#[test] +fn test_subscribe_after_set_min_interval_lower_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&60u64); + + assert_eq!(client.get_min_interval(), 60); + // 60 seconds == new floor — should succeed + client.subscribe(&user, &merchant, &1_0000000, &60, &token_addr, &None, &None); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn prop_subscribe_interval_respects_min_interval_floor() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let default_floor = client.get_min_interval(); + + let mut state = 0x9e3779b97f4a7c15u64; + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % default_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "interval {interval} must be rejected"); + } + + for offset in 0..4 { + let interval = default_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } + + let admin = Address::generate(&env); + client.set_initial_admin(&admin); + let updated_floor = 97u64; + client.set_min_interval(&updated_floor); + assert_eq!(client.get_min_interval(), updated_floor); + + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % updated_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "updated floor rejected interval {interval}"); + } + + for offset in 0..4 { + let interval = updated_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } +} + +/// set_min_interval(0) panics. +#[test] +#[should_panic(expected = "min interval must be positive")] +fn test_set_min_interval_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&0u64); +} + +/// Calling set_min_interval without a configured admin panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_set_min_interval_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics with "admin not set" + client.set_min_interval(&7200u64); +} + +// ───────────────────────────────────────────── +// clear_merchant_revenue_history tests +// ───────────────────────────────────────────── + +/// Admin can clear history; subsequent query returns an empty Vec (zero-length). +/// Clearing does not affect the cumulative revenue total. +#[test] +fn test_clear_merchant_revenue_history_drops_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Produce some history via a charge + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // History should have one entry + let history_before = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_before.len(), 1); + + // Cumulative revenue is present + let revenue = client.get_merchant_revenue(&merchant); + assert!(revenue > 0); + + // Clear history as admin + client.clear_merchant_revenue_history(&merchant); + + // History is now zero-length + let history_after = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_after.len(), 0); + + // Cumulative revenue is untouched + assert_eq!(client.get_merchant_revenue(&merchant), revenue); +} + +/// Clearing history for a merchant with no recorded data is idempotent (does not panic). +#[test] +fn test_clear_merchant_revenue_history_idempotent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let unknown_merchant = Address::generate(&env); + + client.set_initial_admin(&admin); + + // First call — no data exists, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + // Second call — still no data, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + + assert_eq!( + client + .get_merchant_revenue_history(&unknown_merchant, &5u32) + .len(), + 0 + ); +} + +/// Calling clear_merchant_revenue_history without an admin configured panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_clear_merchant_revenue_history_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics + client.clear_merchant_revenue_history(&merchant); +} + +// ───────────────────────────────────────────── +// Subscriber index tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscriber_index_three_unique_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 3); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 3); + assert_eq!(page.get(0).unwrap(), user_a); + assert_eq!(page.get(1).unwrap(), user_b); + assert_eq!(page.get(2).unwrap(), user_c); +} + +#[test] +fn test_get_subscriber_at_returns_first() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_at(&0u64), Some(user)); + assert_eq!(client.get_subscriber_at(&1u64), None); +} + +#[test] +fn test_resubscribe_active_does_not_duplicate_index() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + // Re-subscribe while still active — must not append a second entry + client.subscribe( + &user, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); +} + +#[test] +fn test_subscriber_page_offset_beyond_count_returns_empty() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&1u64, &10u32); + assert_eq!(page.len(), 0); + + let page_zero_limit = client.get_subscriber_page(&0u64, &0u32); + assert_eq!(page_zero_limit.len(), 0); +} + +#[test] +#[cfg(feature = "bench")] +fn test_subscriber_page_limit_capped_at_50() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sac = StellarAssetClient::new(&env, &token_addr); + let token = TokenClient::new(&env, &token_addr); + + for _ in 0..52 { + let sub_user = Address::generate(&env); + sac.mint(&sub_user, &10_000_0000000); + token.approve(&sub_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &sub_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + } + + assert_eq!(client.get_subscriber_count(), 53); + + let page = client.get_subscriber_page(&0u64, &100u32); + assert_eq!(page.len(), 50); +} +// Issue #231: token.rs SAC compatibility test +// ───────────────────────────────────────────── + +/// Test that a custom SAC token (not native XLM) works end-to-end +/// with subscribe, charge, and pay_per_use operations. +#[test] +fn test_custom_sac_token_end_to_end_flow() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Setup a custom SAC token (not the default one from setup()) + let custom_token = setup_second_token(&env, &contract_id, &user); + let token = TokenClient::new(&env, &custom_token); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Step 1: Subscribe with custom SAC token + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &custom_token, + &None, + &None, + ); + + // Verify subscription uses the custom token + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!( + sub.token, custom_token, + "subscription should use custom SAC token" + ); + + // Step 2: Charge after interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + // Verify exact amount transferred + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by subscription amount" + ); + + // Step 3: Pay-per-use with custom SAC token + let user_balance_before_ppu = token.balance(&user); + let merchant_balance_before_ppu = token.balance(&merchant); + + let ppu_amount: i128 = 2_0000000; + client.pay_per_use(&user, &ppu_amount); + + let user_balance_after_ppu = token.balance(&user); + let merchant_balance_after_ppu = token.balance(&merchant); + + // Verify pay-per-use amount transferred + assert_eq!( + user_balance_before_ppu - user_balance_after_ppu, + ppu_amount, + "user balance should decrease by pay_per_use amount" + ); + assert_eq!( + merchant_balance_after_ppu - merchant_balance_before_ppu, + ppu_amount, + "merchant balance should increase by pay_per_use amount" + ); + + // Verify subscription is still active after pay_per_use + let sub_final = client.get_subscription(&user).unwrap(); + assert!( + sub_final.active, + "subscription should remain active after pay_per_use" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #237: get_token() read function tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_token_returns_none_when_not_initialized() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + assert!(client.get_token().is_none()); +} + +#[test] +fn test_get_token_returns_initialized_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +// ───────────────────────────────────────────── +// Issue: get_grace_period getter +// ───────────────────────────────────────────── + +#[test] +fn test_get_grace_period_default_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_grace_period(), 0); +} + +#[test] +fn test_get_grace_period_after_set() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + client.propose_grace_period(&3600); + client.commit_grace_period(); + assert_eq!(client.get_grace_period(), 3600); +} + +// ───────────────────────────────────────────── +// Issue: fee_updated event on set_fee +// ───────────────────────────────────────────── + +#[test] +fn test_set_fee_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_collector, emitted_bps): (Address, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); + assert_eq!(emitted_collector, collector); + assert_eq!(emitted_bps, 100u32); +} + +#[test] +fn test_get_fee_returns_current_fee_settings() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &250); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 250u32))); +} + +#[test] +#[should_panic] +fn test_set_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &10001); + client.commit_fee(); +} + +// ───────────────────────────────────────────── +// Issue: grace_period_updated event on set_grace_period +// ───────────────────────────────────────────── + +#[test] +fn test_set_grace_period_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_grace_period(&7200); + client.commit_grace_period(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let emitted_seconds: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "grace_period_committed")); + assert_eq!(emitted_seconds, 7200u64); +} + +// ───────────────────────────────────────────── +// Issue #195: grace period charge behavior +// ───────────────────────────────────────────── + +#[test] +fn test_charge_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Past billing interval but still inside grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, env.ledger().timestamp()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #9)")] +fn test_charge_after_grace_window_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_non_admin_set_grace_period_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.propose_grace_period(&3600); + client.commit_grace_period(); +} + +// ───────────────────────────────────────────── + +// ------------------------------------------------------------- +// Issue #45: resume/cancel on grace-lapsed subscriptions +// ------------------------------------------------------------- + + +/// resume on a grace-lapsed subscription must panic with ResumeGraceLapsed (#100). +#[test] +#[should_panic(expected = "Error(Contract, #100)")] +fn test_resume_after_grace_lapse_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // resume must be rejected because the grace window has closed + client.resume(&user); +} + +/// cancel on a grace-lapsed subscription must still succeed. +#[test] +fn test_cancel_after_grace_lapse_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // cancel must still be allowed so the user can exit cleanly + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active, "subscription should be inactive after cancel"); +} + +/// resume within a valid (non-lapsed) grace window must succeed normally. +#[test] +fn test_resume_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval but still inside the grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + // resume must succeed because the grace window has not yet closed + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); + assert!(sub.active, "subscription should remain active"); +} + +/// resume when no grace period is configured must succeed regardless of elapsed time. +#[test] +fn test_resume_no_grace_period_always_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No grace period set -- default is 0 + let interval: u64 = 86400; + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance far past the interval -- grace is 0 so lapse check is skipped + env.ledger().with_mut(|l| { + l.timestamp += interval * 10; + }); + + // resume must succeed because grace_period == 0 means no lapse + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); +} + +// Issue #243: Token address validation +// ───────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #12)")] +fn test_subscribe_non_contract_address() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Provide a non-contract address (just an account) + use soroban_sdk::xdr::{AccountId, PublicKey, ScAddress, Uint256}; + use soroban_sdk::TryFromVal; + let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0; 32]))); + let non_contract_token = Address::try_from_val(&env, &ScAddress::Account(account_id)).unwrap(); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &non_contract_token, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_valid_sac_token_address_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_addr); +} + +// Issue #232: charge() insufficient-allowance error path +// ───────────────────────────────────────────── + +/// If a user's token allowance drops below `sub.amount` between subscribe and +/// charge time, `transfer_from` must fail and propagate the error. +#[test] +#[should_panic] +fn test_charge_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Subscribe with sufficient allowance + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Revoke allowance — set it to 0 + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &200); + + // Advance ledger past the interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // charge() should panic because transfer_from fails with insufficient allowance + client.charge(&user); +} + +#[test] +fn test_set_metadata_label_at_limit_succeeds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let valid_label = soroban_sdk::String::from_str( + &env, + "this_is_a_perfectly_valid_sixty_four_character_metadata_label_ok", + ); + assert_eq!(valid_label.len(), 64); + + client.set_metadata(&user, &valid_label); + + assert_eq!(client.get_metadata(&user), Some(valid_label)); +} + +#[test] +#[should_panic] +fn test_set_metadata_label_exceeding_limit_fails() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let invalid_label = soroban_sdk::String::from_str( + &env, + "this_is_an_invalid_sixty_five_character_metadata_label_too_long_!", + ); + assert_eq!(invalid_label.len(), 65); + + client.set_metadata(&user, &invalid_label); +} +// ───────────────────────────────────────────── +// Issue #469: set_subscription_label auth and alias tests +// ───────────────────────────────────────────── +#[test] +fn test_set_metadata_wrong_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let attacker = Address::generate(&env); + let label = soroban_sdk::String::from_str(&env, "hacked"); + client.set_metadata(&attacker, &label); +} + +#[test] +fn test_get_subscription_label_returns_set_value() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let label = soroban_sdk::String::from_str(&env, "premium"); + client.set_metadata(&user, &label); + assert_eq!(client.get_subscription_label(&user), Some(label)); +} + +#[test] +fn test_get_subscription_label_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + assert!(client.get_subscription_label(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Tests for pause() and resume() +// ───────────────────────────────────────────── + +#[test] +fn test_pause_sets_paused_true() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.paused); +} + +#[test] +#[should_panic] +fn test_charge_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_pay_per_use_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + client.pay_per_use(&user, &1_0000000); +} + +#[test] +fn test_resume_unpauses_and_charge_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + client.resume(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.last_charged > 0); +} + +#[test] +#[should_panic] +fn test_pause_on_inactive_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pause(&user); +} + +// ───────────────────────────────────────────── +// Tests for next_charge_at() +// ───────────────────────────────────────────── + +#[test] +fn test_next_charge_at_returns_correct_timestamp() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + let expected = sub.last_charged + sub.interval; + let got = client.next_charge_at(&user).unwrap(); + assert_eq!(got, expected); +} + +#[test] +fn test_next_charge_at_none_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_next_charge_at_none_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.next_charge_at(&random).is_none()); +} + +#[test] +fn test_transfer_subscription_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + assert!( + client.get_subscription(&user).is_none(), + "old subscription should be removed" + ); + + let new_sub = client.get_subscription(&new_user).unwrap(); + assert!(new_sub.active, "new subscription should be active"); + assert_eq!(new_sub.merchant, merchant); + assert_eq!(new_sub.amount, 1_0000000); + assert_eq!(client.get_subscriber_count(), 2); + assert_eq!(client.get_subscriber_at(&0u64), None); + assert_eq!(client.get_subscriber_at(&1u64), Some(new_user)); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_transfer_subscription_to_inactive_user_reuses_tombstone_membership() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let new_user = setup_funded_user(&env, &contract_id, &token_addr); + let inactive_merchant = Address::generate(&env); + + client.subscribe( + &new_user, + &inactive_merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&new_user); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); + + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + assert_eq!(client.get_merchant_sub_count(&inactive_merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); + assert_eq!(page.get(0).unwrap(), new_user); +} + +#[test] +fn test_transfer_subscription_event_emitted() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + let mut seen_transfer_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "subscription_transferred") { + let topic_from: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let topic_to: Address = topics.get(2).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_from, user); + assert_eq!(topic_to, new_user); + + let event_payload: (Address, i128, u64, Address) = data.try_into_val(&env).unwrap(); + assert_eq!(event_payload.0, merchant); + assert_eq!(event_payload.1, 1_0000000); + assert_eq!(event_payload.2, 86400); + assert_eq!(event_payload.3, token_addr); + seen_transfer_event = true; + } + } + + assert!( + seen_transfer_event, + "expected a subscription_transferred event" + ); +} + +#[test] +#[should_panic] +fn test_transfer_subscription_to_active_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &new_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); +} +// ───────────────────────────────────────────── +// CONTRACT-08: Allowance pre-validation tests +// ───────────────────────────────────────────── + +/// subscribe() with zero allowance must panic with InsufficientAllowance +/// and must NOT write the subscription to storage. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_subscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION + // so that subscribe_inner's migration invariant guard is satisfied. + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Deliberately grant zero allowance — no approve() call. + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// After a zero-allowance subscribe() panic, get_subscription() must return None, +/// confirming no storage was written. +/// Note: In the Soroban test environment, panics abort the entire transaction, +/// so storage changes from the failed call are never committed. We verify this +/// by reading storage directly inside the contract after a successful (non-panicking) +/// path: a user who was never subscribed must always return None. +#[test] +fn test_subscribe_zero_allowance_does_not_write_storage() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + // Tests run on a fully-migrated contract; set schema_version to CURRENT_VERSION + // so that subscribe_inner's migration invariant guard is satisfied. + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &migration::CURRENT_VERSION); + }); + + let user = Address::generate(&env); + + // Never approved any allowance — a subscribe call would panic. + // Soroban transactions are atomic: a panic reverts all storage writes. + // We confirm the storage slot starts empty (None) and — since we cannot + // call subscribe without panicking — we verify the invariant holds: a + // user address that has never successfully subscribed always returns None. + let client = FlowPayClient::new(&env, &contract_id); + assert!( + client.get_subscription(&user).is_none(), + "subscription must not be stored for a user who has never successfully subscribed" + ); +} + +/// subscribe() with allowance exactly equal to amount must succeed. +#[test] +fn test_subscribe_exact_allowance_succeeds() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 5_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Approve exactly amount — no more, no less. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &amount, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active, "subscription should be active"); + assert_eq!(sub.amount, amount); +} + +/// Re-subscribe (overwriting a cancelled subscription) with zero allowance +/// must also panic with InsufficientAllowance. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_resubscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 1_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // First subscribe with sufficient allowance. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.cancel(&user); + + // Revoke allowance so second subscribe sees zero. + token.approve(&user, &contract_id, &0, &200); + + // Re-subscribe must panic because allowance is zero. + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); +} + +// ───────────────────────────────────────────── +// CONTRACT-36: set_subscription_amount tests +// ───────────────────────────────────────────── + +/// Admin successfully updates a subscription amount; get_subscription reflects +/// the new value and last_charged / interval are untouched. +#[test] +fn test_set_subscription_amount_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let original_amount: i128 = 1_0000000; + let new_amount: i128 = 3_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &original_amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.amount, original_amount); + let last_charged_before = sub_before.last_charged; + + client.set_subscription_amount(&user, &new_amount); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!(sub_after.amount, new_amount, "amount should be updated"); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.interval, interval, "interval must not change"); + assert!(sub_after.active, "subscription should remain active"); +} + +/// Updating a non-existent subscription must panic with NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_amount_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_amount(&random, &2_0000000); +} + +/// A non-admin caller must not be able to update a subscription amount. +#[test] +#[should_panic] +fn test_set_subscription_amount_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Remove all authorizations so the admin auth check fails. + env.set_auths(&[]); + + client.set_subscription_amount(&user, &2_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-37: set_subscription_interval tests +// ───────────────────────────────────────────── + +/// Admin successfully updates the billing interval; next_charge_at reflects the +/// new value and last_charged / amount are untouched. +#[test] +fn test_set_subscription_interval_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let amount: i128 = 1_0000000; + let original_interval: u64 = 86400; // 1 day + let new_interval: u64 = 30 * 24 * 3600; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &original_interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.interval, original_interval); + let last_charged_before = sub_before.last_charged; + let amount_before = sub_before.amount; + + client.set_subscription_interval(&user, &new_interval); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.interval, new_interval, + "interval should be updated" + ); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.amount, amount_before, "amount must not change"); + assert!(sub_after.active, "subscription should remain active"); + + // next_charge_at must reflect last_charged + new_interval + let expected_next = last_charged_before + new_interval; + assert_eq!( + client.next_charge_at(&user).unwrap(), + expected_next, + "next_charge_at should use the updated interval" + ); +} + +/// Setting an interval of zero must panic with IntervalMustBePositive. +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_set_subscription_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_interval(&user, &0); +} + +/// Updating the interval for a non-existent subscription must panic with +/// NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_interval_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_interval(&random, &86400); +} + +/// A non-admin caller must not be able to update the billing interval. +#[test] +#[should_panic] +fn test_set_subscription_interval_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.set_auths(&[]); + + client.set_subscription_interval(&user, &172800); +} + +// ───────────────────────────────────────────── +// CONTRACT-38: withdraw_merchant_revenue tests +// ───────────────────────────────────────────── + +/// Merchant with accrued revenue can withdraw the full tracked balance. +/// After withdrawal: token balance increases by the tracked amount and the +/// revenue counter resets to zero. +#[test] +fn test_withdraw_merchant_revenue_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + // Initialize the global token so withdraw can resolve it. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // The tracked revenue equals the net charge (no fee configured in setup). + let tracked = client.get_merchant_revenue(&merchant); + assert!(tracked > 0, "revenue should be positive after charge"); + + // Seed the contract with enough tokens to cover the withdrawal. + // In a pooling model the contract would accumulate these from charges + // routed through it; here we simulate that by minting directly. + sac.mint(&contract_id, &tracked); + + let merchant_balance_before = token.balance(&merchant); + + client.withdraw_merchant_revenue(&merchant); + + // Revenue counter must be reset to zero. + assert_eq!( + client.get_merchant_revenue(&merchant), + 0, + "revenue counter must be reset after withdrawal" + ); + + // Merchant token balance must increase by the tracked amount. + let merchant_balance_after = token.balance(&merchant); + assert_eq!( + merchant_balance_after - merchant_balance_before, + tracked, + "merchant token balance should increase by the withdrawn amount" + ); +} + +/// Withdrawal with no accrued balance must panic with ZeroBalanceAvailable. +#[test] +#[should_panic(expected = "Error(Contract, #21)")] +fn test_withdraw_merchant_revenue_zero_balance_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + // No charges have occurred, so revenue is zero. + client.withdraw_merchant_revenue(&merchant); +} + +#[test] +fn test_next_charge_at_none_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_is_charge_due_transitions_after_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Before interval elapses: not due + assert!(!client.is_charge_due(&user)); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + assert!(client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + assert!(!client.is_charge_due(&user)); +} + +// ───────────────────────────────────────────── +// ───────────────────────────────────────────── +// CONTRACT-53: batch_pause_subscriptions tests +// ───────────────────────────────────────────── + +/// Admin can pause multiple valid subscriptions in a single batch call. +/// The test verifies paused flag is set, events are emitted, and already-paused +/// or missing addresses are handled without disruption. +#[test] +fn test_batch_pause_subscriptions_mixed_inputs() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Set up user_b with a subscription + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + // Set up user_c with a subscription (will be paused first) + let user_c = Address::generate(&env); + sac.mint(&user_c, &10_000_0000000); + token.approve(&user_c, &contract_id, &10_000_0000000, &200); + + // Set up user_d with a subscription (valid, will be paused in batch) + let user_d = Address::generate(&env); + sac.mint(&user_d, &10_000_0000000); + token.approve(&user_d, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_d, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Pre-pause user_c + client.pause(&user_c); + let sub_c_before = client.get_subscription(&user_c).unwrap(); + assert!(sub_c_before.paused); + + // Verify all others start unpaused + assert!(!client.get_subscription(&user_a).unwrap().paused); + assert!(!client.get_subscription(&user_b).unwrap().paused); + assert!(!client.get_subscription(&user_d).unwrap().paused); + + // Build batch with mixed inputs: valid, missing, already-paused, valid + let no_sub_user = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); // valid → should be paused + users.push_back(no_sub_user.clone()); // no subscription → skipped + users.push_back(user_c.clone()); // already paused → no-op + users.push_back(user_b.clone()); // valid → should be paused + users.push_back(user_d.clone()); // valid → should be paused + + let events_before = env.events().all().len(); + + client.batch_pause_subscriptions(&users); + + // All valid subscriptions must be paused + let sub_a = client.get_subscription(&user_a).unwrap(); + assert!(sub_a.paused, "user_a should be paused"); + + let sub_b = client.get_subscription(&user_b).unwrap(); + assert!(sub_b.paused, "user_b should be paused"); + + let sub_d = client.get_subscription(&user_d).unwrap(); + assert!(sub_d.paused, "user_d should be paused"); + + // Already-paused user_c remains paused + let sub_c = client.get_subscription(&user_c).unwrap(); + assert!(sub_c.paused, "user_c should remain paused"); + + // No subscription was created for no_sub_user + assert!( + client.get_subscription(&no_sub_user).is_none(), + "no_sub_user should have no subscription" + ); + + // Verify events: three subscription_paused events (user_a, user_b, user_d) + let events_after = env.events().all(); + let paused_event_count = (events_before..events_after.len()) + .filter(|&i| { + let (_, topics, _) = events_after.get(i).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + topic_symbol == Symbol::new(&env, "subscription_paused") + }) + .count(); + assert_eq!( + paused_event_count, 3, + "should emit 3 subscription_paused events" + ); +} + +/// Non-admin callers must be rejected with an auth panic. +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Clear all auths — admin auth should fail and panic + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_pause_subscriptions(&users); +} + +/// Batch size exceeding 25 must panic with BatchTooLarge. +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Build a vector with 26 entries + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_admin_batch_cancel_subscriptions_cancels_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 2); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); +} + +#[test] +fn test_batch_cancel_matches_single_cancel_side_effects() { + let (env, contract_id, token_addr, user_single, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_batch = setup_funded_user(&env, &contract_id, &token_addr); + let referrer = Address::generate(&env); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user_single, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_batch, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer), + ); + + client.cancel(&user_single); + let mut users = Vec::new(&env); + users.push_back(user_batch.clone()); + let results = client.batch_cancel(&users); + + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!( + client.get_subscription(&user_single), + client.get_subscription(&user_batch) + ); + assert_eq!(client.get_referrer(&user_single), None); + assert_eq!(client.get_referrer(&user_batch), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 2); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert_eq!(count_user_events(&env, "cancelled", &user_single), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_batch), 1); +} + +#[test] +#[should_panic] +fn test_batch_cancel_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_cancel(&users); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_cancel_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_cancel(&users); +} + +#[test] +fn test_batch_cancel_at_max_size_succeeds() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..25 { + users.push_back(Address::generate(&env)); + } + + let results = client.batch_cancel(&users); + assert_eq!(results.len(), 25); + for result in results.iter() { + assert_eq!(result, CancelResult::NoSubscription); + } +} + +#[test] +fn test_batch_cancel_handles_mixed_states_and_clears_referral() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + let referrer = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user_c); + + assert_eq!(client.get_referrer(&user_a), Some(referrer)); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + users.push_back(user_c.clone()); + users.push_back(missing_user.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(2).unwrap(), CancelResult::AlreadyCancelled); + assert_eq!(results.get(3).unwrap(), CancelResult::NoSubscription); + + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert!(!client.get_subscription(&user_c).unwrap().active); + assert!(client.get_subscription(&missing_user).is_none()); + + assert_eq!(client.get_referrer(&user_a), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert!(client.get_subscriber_at(&2).is_none()); + + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_c), 1); +} + +// ───────────────────────────────────────────── +// CONTRACT-07: get_merchant_sub_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_sub_count_two_users_cancel_one() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 2); + + client.cancel(&user_a); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_merchant_sub_count_resubscribe_different_merchant() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Subscribe user to merchant A + client.subscribe( + &user, + &merchant_a, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 1); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 0); + + // Re-subscribe user to merchant B + client.subscribe( + &user, + &merchant_b, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 0); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 1); +} + +#[test] +fn test_merchant_sub_count_never_subscribed_returns_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown_merchant = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unknown_merchant), 0); +} + +#[test] +fn test_merchant_sub_count_double_cancel_no_underflow() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + + // Second cancel must not underflow + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); +} + +#[test] +fn test_is_charge_due_false_past_grace_window() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let interval: u64 = 86400; + let grace: u64 = 3600; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.propose_grace_period(&grace); + client.commit_grace_period(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace + 1; + }); + + assert!(!client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(!client.is_charge_due(&Address::generate(&env))); +} + +#[test] +fn test_daily_limit_day_start_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Spend 10 more + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 20_0000000); + + // Manually extend DailyLimit (and other entries touched by the upcoming pay_per_use) + // TTL so they survive the time skip below. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + // 35,000 ledgers > LEDGERS_PER_DAY (17,280) + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance sequence by LEDGERS_PER_DAY + 1 to expire DayStart (17,280 + 1 = 17,281) + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance, which expired when the ledger sequence jumped past it + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // New spend on new day + client.pay_per_use(&user, &15_0000000); + + // Should only be 15, not 35 + assert_eq!(client.get_daily_spent(&user), 15_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-821: simulate_pay_per_use dry-run helper +// ───────────────────────────────────────────── + +/// The sibling dry-run of `pay_per_use` returns distinct outcomes for the +/// inactive, paused, would-succeed, and daily-limit cases, while performing no +/// state writes. +#[test] +fn test_simulate_pay_per_use_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::Inactive + ); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. WouldSucceed when active, no daily limit, allowance sufficient + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + + // 3. DailyLimitExceeded when the limit would be exceeded + client.set_daily_limit(&user, &5_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &6_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 4. DailyLimitExceeded on cumulative spend: 3, then simulate another 3 (>5) + client.pay_per_use(&user, &3_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &3_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 5. SubscriptionPaused when paused + let before_spent = client.get_daily_spent(&user); + client.pause(&user); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::SubscriptionPaused + ); + client.resume(&user); + + // 6. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::InsufficientAllowance + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::ContractPaused + ); + + // No simulation wrote to daily spend tracking. + assert_eq!(client.get_daily_spent(&user), before_spent); +} + +/// `simulate_pay_per_use` performs no state writes: daily spent, day start, and +/// balance are unchanged regardless of the simulated outcome. +#[test] +fn test_simulate_pay_per_use_no_state_writes() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + + client.pay_per_use(&user, &2_0000000); + + let spent_before = client.get_daily_spent(&user); + let day_start_before = client.get_day_start(&user); + let balance_before = TokenClient::new(&env, &token_addr) + .balance(&user); + + // Would succeed + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + // Limit exceeded + assert_eq!( + client.simulate_pay_per_use(&user, &5_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + assert_eq!(client.get_daily_spent(&user), spent_before); + assert_eq!(client.get_day_start(&user), day_start_before); + assert_eq!( + TokenClient::new(&env, &token_addr).balance(&user), + balance_before + ); +} + +/// Simulating a spend at a day-window boundary reflects the fresh (reset) daily +/// spent value after the window has elapsed, mirroring `pay_per_use`. +#[test] +fn test_simulate_pay_per_use_day_window_reset_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 today. + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Crossing the day boundary makes the reset daily spent visible to the + // dry-run: today a 45 spend would exceed (10 + 45 > 50)... + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // Manually extend the DailyLimit (and merchant-revenue) TTL so they survive + // the time skip below, while intentionally leaving DailySpent/DayStart to + // expire so the new window starts from a reset counter. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance past the day window (LEDGERS_PER_DAY + 1). + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance that expired with the ledger jump. + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // The new day's simulated spend is evaluated against a reset counter, + // so the same 45 amount now succeeds. + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use_to` accounts for recipient validation (invalid +/// contract self-reference and merchant whitelist) in addition to the shared +/// pay-per-use checks. +#[test] +fn test_simulate_pay_per_use_to_recipient_validation() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Contract's own address is an invalid recipient. + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &contract_id), + PayPerUseSimResult::InvalidRecipient + ); + + // With whitelist enabled, a non-whitelisted recipient is rejected. + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, true); + }); + let random = Address::generate(&env); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &random), + PayPerUseSimResult::MerchantNotWhitelisted + ); + + // A valid, whitelisted recipient would succeed. + env.as_contract(&contract_id, || { + whitelist::add_merchant(&env, &merchant); + }); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &merchant), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use` rejects non-positive and over-cap amounts with the +/// same outcomes the real call enforces. +#[test] +fn test_simulate_pay_per_use_amount_bounds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No subscription yet, but amount bounds are checked before subscription. + assert_eq!( + client.simulate_pay_per_use(&user, &0), + PayPerUseSimResult::AmountMustBePositive + ); + assert_eq!( + client.simulate_pay_per_use(&user, &(MAX_AMOUNT + 1)), + PayPerUseSimResult::AmountExceedsMaximum + ); +} + +// ───────────────────────────────────────────── +// New Feature Unit Tests (Issues #628, #638, #640, #641) +// ───────────────────────────────────────────── + +#[test] +fn test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user2 = Address::generate(&env); + let user3_unknown = Address::generate(&env); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user2, &contract_id, &1_000_000_000, &100); + + client.subscribe( + &user1, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user2, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user1.clone()); + users.push_back(user2.clone()); + users.push_back(user3_unknown.clone()); + + let extended = client.batch_extend_subscription_ttl(&users); + assert_eq!(extended.len(), 2); + assert_eq!(extended.get(0).unwrap(), user1); + assert_eq!(extended.get(1).unwrap(), user2); +} + +#[test] +#[should_panic] +fn test_batch_extend_subscription_ttl_over_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + users.push_back(Address::generate(&env)); + } + + client.batch_extend_subscription_ttl(&users); +} + +#[test] +fn test_simulate_charge_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!(client.simulate_charge(&user), ChargeSimResult::Inactive); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. NotDue immediately after subscribe + assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); + + // Advance time past interval + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + // 3. WouldSucceed when due and allowed + assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); + + // 4. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::InsufficientAllowance + ); + + // Restore allowance + token.approve(&user, &contract_id, &1_000_000_000, &100); + + // 5. SubscriptionPaused when paused + client.pause(&user); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::SubscriptionPaused + ); + + // Resume + client.resume(&user); + + // 6. GracePeriodElapsed + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::GracePeriod, &3600u64); + }); + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 3601; + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::GracePeriodElapsed + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::ContractPaused + ); +} + +#[test] +fn test_get_schema_version_returns_zero_and_updates() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_schema_version(), 0); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_contract_address_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.pay_per_use_to(&user, &1_0000000, &contract_id); +} + +#[test] +fn test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 4_0000000; + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, amount); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #634: get_merchant_revenue_summary +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_summary_empty() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let summary = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary, (0, 0, 0, 0)); +} + +#[test] +fn test_merchant_revenue_summary_single_and_multiple_charges() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 10_0000000; + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.pay_per_use(&user, &amount); + + // First charge recorded: 10_0000000 + let summary1 = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary1, (amount, 1, amount, amount)); + + // Additional pay_per_use calls with different amounts + client.pay_per_use(&user, &5_0000000); + client.pay_per_use(&user, &25_0000000); + + let summary2 = client.get_merchant_revenue_summary(&merchant); + // total = 10 + 5 + 25 = 40_0000000 + // count = 3 + // min = 5_0000000 + // max = 25_0000000 + assert_eq!(summary2, (40_0000000, 3, 5_0000000, 25_0000000)); +} + +#[test] +fn test_merchant_revenue_summary_cleared_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &10_0000000); + client.clear_merchant_revenue_history(&merchant); + + let summary = client.get_merchant_revenue_summary(&merchant); + // History cleared -> total remains 10_0000000, count/min/max return 0 + assert_eq!(summary, (10_0000000, 0, 0, 0)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #635: get_subscription_health +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_subscription_health_non_existent_user() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let unknown = Address::generate(&env); + + let health = client.get_subscription_health(&unknown); + assert_eq!( + health, + SubscriptionHealth { + active: false, + charge_due: false, + within_grace: false, + has_sufficient_allowance: false, + is_paused: false, + trial_active: false, + daily_limit_set: false, + } + ); +} + +#[test] +fn test_subscription_health_active_healthy() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.charge_due, false); + assert_eq!(health.within_grace, false); + assert_eq!(health.has_sufficient_allowance, true); + assert_eq!(health.is_paused, false); + assert_eq!(health.trial_active, false); + assert_eq!(health.daily_limit_set, false); +} + +#[test] +fn test_subscription_health_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.is_paused, true); + assert_eq!(health.charge_due, false); +} + +#[test] +fn test_subscription_health_trial_active() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let trial_sec = 7 * 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &Some(trial_sec), + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.trial_active, true); +} + +#[test] +fn test_subscription_health_grace_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_grace_period(&86400); + client.commit_grace_period(); + + let interval = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Fast-forward ledger past interval, into grace period window + env.ledger().set(soroban_sdk::testutils::LedgerInfo { + timestamp: env.ledger().timestamp() + interval + 3600, + protocol_version: 20, + sequence_number: 100, + network_id: [0u8; 32], + base_reserve: 10, + min_temp_entry_ttl: 16, + min_persistent_entry_ttl: 16, + max_entry_ttl: 3110400, + }); + + let health = client.get_subscription_health(&user); + assert_eq!(health.charge_due, true); + assert_eq!(health.within_grace, true); +} + +#[test] +fn test_subscription_health_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Revoke allowance + token.approve(&user, &contract_id, &0, &1000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.has_sufficient_allowance, false); +} + +#[test] +fn test_subscription_health_daily_limit_set() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.daily_limit_set, true); +} + +/// set_initial_admin with proper auth when Admin is unset succeeds and stores admin. +#[test] +fn test_set_initial_admin_success_once() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// A second set_initial_admin call must return typed AdminAlreadySet (code 42), +/// not a raw string panic, and must not change the stored admin. +#[test] +fn test_set_initial_admin_second_call_returns_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin1 = Address::generate(&env); + let admin2 = Address::generate(&env); + + client.set_initial_admin(&admin1); + assert_eq!(client.get_admin(), Some(admin1.clone())); + + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "second set_initial_admin must map to ContractError::AdminAlreadySet" + ); + + // First admin is unchanged — no partial overwrite. + assert_eq!(client.get_admin(), Some(admin1)); +} + +/// Calling set_initial_admin without the proposed admin's auth must fail with an +/// authorization error (host-level, not a contract-level typed error) and must +/// not write the admin slot. +#[test] +fn test_set_initial_admin_unauthenticated_fails() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_set_initial_admin(&admin); + assert!( + result.is_err(), + "set_initial_admin without proposed admin auth must fail" + ); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "missing auth must be an authorization failure, not AdminAlreadySet" + ); + + assert!( + client.get_admin().is_none(), + "failed set_initial_admin must not persist admin" + ); +} + +/// Partial-init edge case: Token is already stored (e.g. from a separate +/// deploy-step) but Admin slot is still empty. set_initial_admin must still +/// require auth, succeed, and not be confused with initialize's state. +#[test] +fn test_set_initial_admin_token_present_admin_missing() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // Simulate partial init: write Token but not Admin. + env.as_contract(&contract_id, || { + storage::set_token(&env, &token_addr); + }); + + // Sanity: token stored, admin missing. + assert_eq!(client.get_token(), Some(token_addr.clone())); + assert!(client.get_admin().is_none()); + + // set_initial_admin must still require auth and succeed. + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin.clone())); + // Token state untouched. + assert_eq!(client.get_token(), Some(token_addr)); + + // Subsequent call returns typed error (not a panic) even in partial-init + // post-success state. + let admin2 = Address::generate(&env); + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "post-success second call must return AdminAlreadySet in partial-init scenario" + ); + assert_eq!(client.get_admin(), Some(admin)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #636: validate_interval hardening +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_subscribe_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &10_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic(expected = "Error(Contract, #19)")] +fn test_set_subscription_interval_below_min_interval_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Setting interval to 100 seconds when MinInterval is default 3600 panics with #19 (IntervalTooShort) + client.set_subscription_interval(&user, &100); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #637: WhitelistIndex & pagination +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_whitelist_index_size_page_and_swap_remove() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_whitelist_size(), 0); + assert_eq!(client.get_whitelist_page(&0, &10).len(), 0); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Idempotent double add does not increment index size + client.add_merchant(&m2); + + assert_eq!(client.get_whitelist_size(), 3); + + let page_all = client.get_whitelist_page(&0, &10); + assert_eq!(page_all.len(), 3); + assert_eq!(page_all.get(0).unwrap(), m1); + assert_eq!(page_all.get(1).unwrap(), m2); + assert_eq!(page_all.get(2).unwrap(), m3); + + // Test pagination offset & limit + let page_subset = client.get_whitelist_page(&1, &1); + assert_eq!(page_subset.len(), 1); + assert_eq!(page_subset.get(0).unwrap(), m2); + + // Remove middle item (m2) -> swap-remove moves m3 into index 1 + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); + + let page_after_remove = client.get_whitelist_page(&0, &10); + assert_eq!(page_after_remove.len(), 2); + assert_eq!(page_after_remove.get(0).unwrap(), m1); + assert_eq!(page_after_remove.get(1).unwrap(), m3); + + // Idempotent double remove does nothing + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #2)")] +fn test_subscription_amount_validation_zero() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount to 0 (panics with AmountMustBePositive, error 19) + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &0); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #15)")] +fn test_subscription_amount_validation_exceeds_max() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount above MAX_SUBSCRIPTION_AMOUNT + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &(crate::MAX_SUBSCRIPTION_AMOUNT + 1)); +} + +#[test] +fn test_batch_charge_estimate() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + + assert_eq!(estimate.len(), 1); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::NoSubscription + ); +} + +#[test] +fn test_contract_config() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let config = client.get_contract_config(); + assert_eq!(config.schema_version, 1); + assert_eq!(config.paused, false); +} + +#[test] +fn test_daily_spent_reset() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert!(client.get_day_start(&user).is_none()); +} + +// ───────────────────────────────────────────────────────────── +// Issue #11: extend_subscriber_index_ttl tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_extend_subscriber_index_ttl_empty_index_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_subscriber_count(), 0); + client.extend_subscriber_index_ttl(); + assert_eq!(client.get_subscriber_count(), 0); +} + +#[test] +fn test_extend_subscriber_index_ttl_emits_event_with_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 2); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_ttl_extended") + ); + assert_eq!(count, 2); +} + +#[test] +fn test_extend_subscriber_index_ttl_extends_large_index() { + use soroban_sdk::testutils::storage::Persistent as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + for _ in 0..5 { + let u = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe(&u, &merchant, &1_0000000, &86400, &token_addr, &None, &None); + users.push_back(u); + } + + assert_eq!(client.get_subscriber_count(), 5); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, _, data) = events.get(events.len() - 1).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + assert_eq!(count, 5); + + env.as_contract(&contract_id, || { + let ttl = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndexSize); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS); + + let ttl_0 = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndex(0)); + assert!(ttl_0 >= SUBSCRIPTION_TTL_LEDGERS); + }); +} + +#[test] +#[should_panic] +fn test_extend_subscriber_index_ttl_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.extend_subscriber_index_ttl(); +} + +// ───────────────────────────────────────────────────────────── +// Issue #838: clear_subscriber_index_entry admin repair +// ───────────────────────────────────────────────────────────── + +/// Simulate a stale index slot: the subscription is inactive but the +/// append-only index was never tombstoned (the corruption this repair +/// entrypoint is meant to fix). +fn deactivate_subscription_leaving_index(env: &Env, contract_id: &Address, user: &Address) { + env.as_contract(contract_id, || { + let mut sub = storage::get_subscription(env, user).expect("subscription"); + sub.active = false; + storage::set_subscription(env, user, &sub); + }); +} + +#[test] +fn test_clear_subscriber_index_entry_authorized_repair_tombstones_stale_slot() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_at(&0u64), Some(user.clone())); + + deactivate_subscription_leaving_index(&env, &contract_id, &user); + assert_eq!( + client.get_subscriber_at(&0u64), + Some(user.clone()), + "stale slot must still be visible before repair" + ); + + client.clear_subscriber_index_entry(&0u64); + + assert_eq!( + client.get_subscriber_at(&0u64), + None, + "repaired slot must be tombstoned" + ); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 0); + assert_eq!( + client.get_subscriber_count(), + 1, + "repair must not shrink the append-only index" + ); +} + +#[test] +#[should_panic] +fn test_clear_subscriber_index_entry_unauthorized_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + env.set_auths(&[]); + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +#[should_panic(expected = "Error(Contract, #41)")] +fn test_clear_subscriber_index_entry_refuses_active_subscriber() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +fn test_clear_subscriber_index_entry_emits_audit_event() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + client.clear_subscriber_index_entry(&0u64); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let index: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_cleared") + ); + assert_eq!(topic_user, user); + assert_eq!(index, 0); +} + +// ───────────────────────────────────────────────────────────── +// Issue #610: get_subscription_token tests +// ───────────────────────────────────────────────────────────── + +/// get_subscription_token returns None before the user subscribes. +#[test] +fn test_get_subscription_token_none_before_subscribe() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription_token(&random).is_none(), + "get_subscription_token should return None for a user with no subscription" + ); +} + +/// get_subscription_token returns Some(token) after subscribe. +#[test] +fn test_get_subscription_token_some_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) after subscribe" + ); +} + +/// get_subscription_token still returns Some(token) after cancel — the record +/// exists but is inactive; callers that need to distinguish active vs cancelled +/// should use get_subscription instead. +#[test] +fn test_get_subscription_token_some_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + // The subscription record still exists (active=false), so token is still readable. + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) for cancelled subscription" + ); +} + +/// get_subscription_token reflects the token when the user re-subscribes with +/// a different token. +#[test] +fn test_get_subscription_token_updates_on_resubscribe() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, &merchant, &1_0000000, &86400, &token_a, &None, &None, + ); + assert_eq!(client.get_subscription_token(&user), Some(token_a.clone())); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe( + &user, &merchant, &2_0000000, &86400, &token_b, &None, &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_b), + "get_subscription_token should return the latest token after resubscribe" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #611: propose_fee / commit_fee two-step tests +// ───────────────────────────────────────────────────────────── + +/// Full propose → commit flow sets the fee collector and bps. +#[test] +fn test_propose_and_commit_fee_sets_fee() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &250); + client.commit_fee(); + + let result = client.get_fee(); + assert!(result.is_some()); + let (stored_collector, stored_bps) = result.unwrap(); + assert_eq!(stored_collector, collector); + assert_eq!(stored_bps, 250); +} + +/// propose_fee emits a fee_proposed event. +#[test] +fn test_propose_fee_emits_fee_proposed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_proposed")); +} + +/// commit_fee emits a fee_committed event. +#[test] +fn test_commit_fee_emits_fee_committed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &50); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); +} + +/// commit_fee without a prior propose panics with NoPendingProposal (#23). +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_fee_without_proposal_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.commit_fee(); +} + +/// propose_fee with bps > 10000 panics with InvalidFeeBps (#13). +#[test] +#[should_panic(expected = "Error(Contract, #13)")] +fn test_propose_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_001); +} + +/// A re-propose before commit replaces the pending fee — commit applies +/// the latest proposal. +#[test] +fn test_repropose_before_commit_applies_latest() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector_a = Address::generate(&env); + let collector_b = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector_a, &100); + // Re-propose with different values before committing + client.propose_fee(&collector_b, &200); + client.commit_fee(); + + let (stored_collector, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_collector, collector_b); + assert_eq!(stored_bps, 200); +} + +/// After commit_fee, committing again without a new propose panics. +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_double_commit_without_repropose_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + client.commit_fee(); + // Second commit without a new propose must panic + client.commit_fee(); +} + +/// Bps of exactly 10000 (100%) is valid at both propose and commit. +#[test] +fn test_propose_fee_max_valid_bps() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_000); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 10_000); +} + +/// Bps of 0 is valid (disabling the fee while keeping the collector). +#[test] +fn test_propose_fee_zero_bps_valid() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &0); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 0); +} + +/// Non-admin calling propose_fee panics. +#[test] +#[should_panic] +fn test_propose_fee_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin set; require_admin call inside propose_fee should panic. + // NOTE: propose_fee in lib.rs calls bump_instance_ttl then fee::propose_fee. + // fee::propose_fee itself does not require_admin — the admin guard + // is the caller's responsibility in lib.rs. We verify the whole + // public entry point panics when no admin is configured. + let collector = Address::generate(&env); + + // Explicitly set an admin so admin check works, then revoke auths. + client.propose_fee(&collector, &100); +} + +// ───────────────────────────────────────────── +// Issue 012: commit_fee bounds re-validation +// ───────────────────────────────────────────── + +/// commit_fee rejects when bounds tightened after propose (bps above new max). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_above_max() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 500 bps — within default bounds (0, 10000) + client.propose_fee(&collector, &500); + + // Tighten max to 200 bps before commit + client.set_fee_bounds(&0, &200); + + // Commit should reject 500 bps against new [0, 200] bounds + client.commit_fee(); +} + +/// commit_fee rejects when bounds tightened after propose (bps below new min). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_below_min() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 50 bps + client.propose_fee(&collector, &50); + + // Raise min to 100 bps before commit + client.set_fee_bounds(&100, &10000); + + // Commit should reject 50 bps against new [100, 10000] bounds + client.commit_fee(); +} + +/// commit_fee succeeds when pending bps are within current bounds. +#[test] +fn test_commit_fee_succeeds_when_within_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_fee_bounds(&10, &500); + client.propose_fee(&collector, &200); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 200); +} + +/// commit_fee succeeds when no bounds are configured (defaults to 0..10000). +#[test] +fn test_commit_fee_succeeds_with_default_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // No set_fee_bounds call — defaults to (0, 10000) + client.propose_fee(&collector, &750); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 750); +} + +// ───────────────────────────────────────────── +// Batch queries tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_merchant_statuses_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.get_merchant_statuses(&merchants); + assert_eq!(result.len(), 0); +} + +#[test] +fn test_get_merchant_statuses_mixed() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); +} + +// Issue #9: validate_recipient_address tests +// ───────────────────────────────────────────── + +/// set_fee() with a valid (non-contract) collector address must succeed. +#[test] +fn test_validate_recipient_address_valid_passes() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + // Must not panic — a regular address is a valid fee collector. + client.propose_fee(&collector, &100u32); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 100u32))); +} + +/// set_fee() with the contract's own address as collector must panic with +/// ContractError::InvalidFeeCollector (error code 26). +#[test] +#[should_panic(expected = "Error(Contract, #26)")] +fn test_validate_recipient_address_contract_self_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Passing the contract address as fee collector must be rejected. + client.propose_fee(&contract_id, &100u32); + client.commit_fee(); +} +// ───────────────────────────────────────────────────────────── +// Issue #3: Per-Merchant Fee Recipient Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_set_and_get_merchant_fee_recipient() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + assert_eq!( + client.get_merchant_fee_recipient(&merchant), + Some(custom_recipient) + ); +} + +#[test] +fn test_set_merchant_fee_recipient_contract_address_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let res = client.try_set_merchant_fee_recipient(&merchant, &contract_id); + assert!(res.is_err()); +} + +#[test] +fn test_merchant_fee_recipient_routing_and_fallback() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(86400); + client.charge(&user); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + env.ledger().set_timestamp(172800); + client.charge(&user); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_get_next_charge_batch_empty_and_bounds() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 0); + + let batch_oob = client.get_next_charge_batch(&5, &10, &None); + assert_eq!(batch_oob.len(), 0); +} + +#[test] +fn test_get_next_charge_batch_filtering() { + let (env, contract_id, token_addr, user_due, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_not_due = setup_funded_user(&env, &contract_id, &token_addr); + let user_paused = setup_funded_user(&env, &contract_id, &token_addr); + let user_cancelled = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_paused, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_cancelled, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + client.pause(&user_paused); + client.cancel(&user_cancelled); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe(&user_not_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user_due); +} + +#[test] +fn test_get_next_charge_batch_pagination() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user2 = setup_funded_user(&env, &contract_id, &token_addr); + let user3 = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user3, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let batch1 = client.get_next_charge_batch(&0, &2, &None); + assert_eq!(batch1.len(), 2); + assert_eq!(batch1.get(0).unwrap(), user1); + assert_eq!(batch1.get(1).unwrap(), user2); + + let batch2 = client.get_next_charge_batch(&2, &2, &None); + assert_eq!(batch2.len(), 1); + assert_eq!(batch2.get(0).unwrap(), user3); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_next_charge_batch_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.get_next_charge_batch(&0, &51, &None); +} + +#[test] +fn test_get_next_charge_batch_exclude_lapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval, but WITHIN grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period - 100; + }); + + // It should be returned because it's due and not lapsed + let batch = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += 200; // past the grace period + }); + + // When exclude_lapsed is Some(true) or None, it should NOT be returned + let batch_exclude = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch_exclude.len(), 0); + + let batch_default = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch_default.len(), 0); + + // When exclude_lapsed is Some(false), it should be returned + let batch_include = client.get_next_charge_batch(&0, &10, &Some(false)); + assert_eq!(batch_include.len(), 1); + assert_eq!(batch_include.get(0).unwrap(), user); +} + +#[test] +fn test_merchant_fee_recipient_routes_pay_per_use_and_falls_back() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +// ───────────────────────────────────────────────────────────── +// Issue #4: Bounded Pause with Auto-Resume Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_pause_until_auto_resume_on_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(86400); + let res = client.try_charge(&user); + assert!(res.is_err()); + + env.ledger().set_timestamp(90000); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + assert_eq!(token.balance(&merchant), 1000); +} + +#[test] +fn test_pause_until_invalid_expiry_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(200000); + let res = client.try_pause_until(&user, &200000); + assert!(res.is_err()); + let res2 = client.try_pause_until(&user, &150000); + assert!(res2.is_err()); +} + +#[test] +fn test_resume_clears_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &300000); + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +#[test] +fn test_pause_until_auto_resume_on_batch_charge_and_clears_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(90000); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let result = client.batch_charge(&users); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +// ───────────────────────────────────────────────────────────── +// Issue #5: get_referral Read Function Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_referral_lifecycle() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer.clone())); + + client.cancel(&user); + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer)); +} + +// ───────────────────────────────────────────────────────────── +// Issue #6: Storage Migration v3 Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_migration_v2_to_v3_populates_referrer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + assert_eq!(client.get_schema_version(), 2); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + assert_eq!(client.get_schema_version(), 3); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.referrer, Some(referrer)); + + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────────────────────── +// Issue 011: ChargeResult discriminant stability (golden tests) +// ───────────────────────────────────────────────────────────── +// +// Off-chain parsers (keepers, alert-failed-charges.ts, indexers) +// decode ChargeResult by variant index. These tests lock the +// discriminant layout so a reorder or rename is caught in CI. + +/// The number of ChargeResult variants. If you add a new variant, +/// update this count AND append the new variant at the end of the enum. +#[test] +fn test_charge_result_variant_count() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + // Encode each variant via IntoVal and verify they produce distinct values. + // This also serves as a compile-time check: if a variant is removed or + // renamed, this test won't compile (exhaustive pattern match). + let charged: soroban_sdk::Val = ChargeResult::Charged.into_val(&env); + let skipped: soroban_sdk::Val = ChargeResult::Skipped.into_val(&env); + let no_sub: soroban_sdk::Val = ChargeResult::NoSubscription.into_val(&env); + let inactive: soroban_sdk::Val = ChargeResult::Inactive.into_val(&env); + let paused: soroban_sdk::Val = ChargeResult::Paused.into_val(&env); + let grace: soroban_sdk::Val = ChargeResult::GracePeriodElapsed.into_val(&env); + + // All variants must encode to distinct raw values + let c = unsafe { core::mem::transmute::(charged) }; + let s = unsafe { core::mem::transmute::(skipped) }; + let n = unsafe { core::mem::transmute::(no_sub) }; + let i = unsafe { core::mem::transmute::(inactive) }; + let p = unsafe { core::mem::transmute::(paused) }; + let g = unsafe { core::mem::transmute::(grace) }; + + assert_ne!(c, s, "Charged and Skipped must differ"); + assert_ne!(s, n, "Skipped and NoSubscription must differ"); + assert_ne!(n, i, "NoSubscription and Inactive must differ"); + assert_ne!(i, p, "Inactive and Paused must differ"); + assert_ne!(p, g, "Paused and GracePeriodElapsed must differ"); + + // Lock the variant count — increase when a variant is appended. + let total_variants = 6; + assert_eq!(total_variants, 6); +} + +/// Verify round-trip encoding for every variant. +#[test] +fn test_charge_result_round_trip() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + let variants = [ + ChargeResult::Charged, + ChargeResult::Skipped, + ChargeResult::NoSubscription, + ChargeResult::Inactive, + ChargeResult::Paused, + ChargeResult::GracePeriodElapsed, + ]; + + for variant in variants.iter() { + let val: soroban_sdk::Val = variant.clone().into_val(&env); + let decoded = ChargeResult::try_from_val(&env, &val).unwrap(); + assert_eq!(*variant, decoded, "round-trip failed for a ChargeResult variant"); + } +} + +/// Verify that variant names match the expected set. +/// A rename or reorder breaks this test. +#[test] +fn test_charge_result_partial_eq_identity() { + assert_eq!(ChargeResult::Charged, ChargeResult::Charged); + assert_ne!(ChargeResult::Charged, ChargeResult::Skipped); + assert_ne!(ChargeResult::NoSubscription, ChargeResult::Inactive); + assert_ne!(ChargeResult::Paused, ChargeResult::GracePeriodElapsed); +} + + +// ───────────────────────────────────────────── +// CONTRACT-804: checked arithmetic in trial, fee, and volume paths +// ───────────────────────────────────────────── + +#[test] +fn test_extend_trial_pushes_last_charged_forward() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.extend_trial(&user, &86400); + + assert_eq!( + client.get_subscription(&user).unwrap().last_charged, + before + 86400 + ); +} + +/// A trial extension past `u64::MAX` must fail closed with the typed +/// `ArithmeticOverflow` (#36) rather than an untyped `unwrap` panic. +#[test] +fn test_extend_trial_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // Push last_charged to the u64 ceiling, then ask for one second more. + client.extend_trial(&user, &(u64::MAX - client.get_subscription(&user).unwrap().last_charged)); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, u64::MAX); + + let res = client.try_extend_trial(&user, &1); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// Extending a paused subscription's trial must fail closed with the typed +/// `SubscriptionPaused` (#17) error rather than advancing `last_charged` into +/// a chargeable state. +#[test] +fn test_extend_trial_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.pause(&user); + + let res = client.try_extend_trial(&user, &86400); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(17)))); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, before); +} + +/// `amount * bps` must not wrap for amounts beyond the economic caps. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_calculate_fee_amount_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + fee::calculate_fee_amount(&env, i128::MAX, 10_000); + }); +} + +#[test] +fn test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + // The largest amount the contract will accept, at the maximum bps. + assert_eq!( + fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 10_000), + MAX_SUBSCRIPTION_AMOUNT + ); + assert_eq!(fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 0), 0); + }); +} + +/// Accruing a fee onto a `TotalProtocolFees` counter at `i128::MAX` must fail +/// closed rather than wrap the protocol's own bookkeeping. +#[test] +fn test_protocol_fee_accrual_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + configure_fee(&env, &contract_id, 500); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::TotalProtocolFees, &i128::MAX); + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let res = client.try_charge(&user); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// An accumulator that cannot represent the sum is an overflow (#36), which is +/// a different failure from breaching the hourly cap (#28). +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_accumulator_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: env.ledger().timestamp(), + accumulated_volume: i128::MAX, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// A window start near `u64::MAX` must not wrap the rollover comparison. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_window_end_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: u64::MAX, + accumulated_volume: 0, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// Breaching the hourly cap still reports `GlobalVolumeExceeded` (#28) — +/// the overflow work above must not have changed the cap's error mapping. +#[test] +#[should_panic(expected = "Error(Contract, #28)")] +fn test_global_volume_cap_breach_still_reports_28() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + check_and_update_global_volume(&env, GLOBAL_MAX_VOLUME_PER_HOUR + 1); + }); +} + +// ───────────────────────────────────────────── +// CONTRACT-805: batch_charge_skips summary event +// ───────────────────────────────────────────── + +/// Helper: returns the payload of the single `batch_charge_skips` event in the +/// event log, or `None` when no such event was emitted. +fn find_batch_charge_skips(env: &Env) -> Option { + let mut found = None; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol == Symbol::new(env, "batch_charge_skips") { + assert_eq!( + topics.len(), + 1, + "batch_charge_skips carries no address topic" + ); + assert!( + found.is_none(), + "at most one summary event per batch_charge call" + ); + found = Some(data.try_into_val(env).unwrap()); + } + } + found +} + +/// Helper: funds a fresh user and subscribes them for `interval`. +fn subscribe_funded_user( + env: &Env, + contract_id: &Address, + token_addr: &Address, + merchant: &Address, + interval: u64, +) -> Address { + let client = FlowPayClient::new(env, contract_id); + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200000); + client.subscribe( + &user, + merchant, + &1_0000000, + &interval, + token_addr, + &None, + &None, + ); + user +} + +/// A batch mixing charges with paused / cancelled / missing / grace-elapsed +/// subscriptions emits one summary event whose counts reconcile with the +/// returned results. +#[test] +fn test_batch_charge_emits_skips_summary_with_counts() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + install_admin(&env, &contract_id); + client.propose_grace_period(&3600); + client.commit_grace_period(); + + let paused_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let cancelled_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let grace_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + client.pause(&paused_user); + client.cancel(&cancelled_user); + + // Push grace_user past its interval AND its grace window. + env.ledger().with_mut(|l| { + l.timestamp += interval + 3601 + 1; + }); + + // Subscribe the chargeable user now, then advance just past its interval so + // it is due but still inside the grace window. + let chargeable = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(chargeable.clone()); + users.push_back(paused_user.clone()); + users.push_back(cancelled_user.clone()); + users.push_back(grace_user.clone()); + users.push_back(unknown_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Paused); + assert_eq!(results.get(2).unwrap(), ChargeResult::Inactive); + assert_eq!(results.get(3).unwrap(), ChargeResult::GracePeriodElapsed); + assert_eq!(results.get(4).unwrap(), ChargeResult::NoSubscription); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 5); + assert_eq!(summary.charged, 1); + assert_eq!(summary.not_due, 0); + assert_eq!(summary.paused, 1); + assert_eq!(summary.inactive, 1); + assert_eq!(summary.grace_elapsed, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.ledger_sequence, env.ledger().sequence()); + + // The counts must account for every submitted address. + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// An all-success batch must not emit the summary — and its `charged` events +/// are unchanged. +#[test] +fn test_batch_charge_all_charged_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Charged); + + assert!( + find_batch_charge_skips(&env).is_none(), + "an all-charged batch must stay silent" + ); + + // `charged` events are untouched by this feature. + let charged_events = env + .events() + .all() + .iter() + .filter(|(_, topics, _)| { + let s: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + s == Symbol::new(&env, "charged") + }) + .count(); + assert_eq!(charged_events, 2); +} + +/// Not-due skips are the common, uninteresting outcome and must not emit. +#[test] +fn test_batch_charge_not_due_only_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Skipped); + assert_eq!(results.get(1).unwrap(), ChargeResult::Skipped); + + assert!( + find_batch_charge_skips(&env).is_none(), + "a not-due-only batch must stay silent" + ); +} + +/// An allowance shortfall is a per-user `AllowanceInsufficient` result (it does +/// not abort the batch) and is an interesting failure: it alone must emit the +/// summary, since a keeper needs to know a subscriber has to re-approve. +#[test] +fn test_batch_charge_allowance_insufficient_counted_in_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let interval: u64 = 86400; + + let ok_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let broke_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + // One stroop short of the gross subscription amount. + token.approve(&broke_user, &contract_id, &(1_0000000 - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(ok_user.clone()); + users.push_back(broke_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!( + results.get(1).unwrap(), + ChargeResult::AllowanceInsufficient + ); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.charged, 1); + assert_eq!(summary.allowance_insufficient, 1); + assert_eq!(summary.not_due, 0); + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// A single interesting failure alongside not-due skips is enough to emit, +/// and the not-due count rides along for reconciliation. +#[test] +fn test_batch_charge_single_interesting_failure_emits_with_not_due_count() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let not_due_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(not_due_user.clone()); + users.push_back(unknown_user.clone()); + + client.batch_charge(&users); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.not_due, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.charged, 0); +} + +// Issue #813: batch_charge stress / resource-envelope coverage +// +// These tests exercise `batch_charge` at the configured max batch size and one +// above it, matching the resource envelope documented for `set_max_batch_size`. +// Soroban's per-invocation budget is finite, so each test resets it to +// unlimited up front (`env.budget().reset_unlimited()`, as the existing +// `test_batch_charge_stress` does) so the setup + one `batch_charge` invocation +// is measured without being throttled by the 200 M default budget. +// +// Approximate resource usage for a max-size batch at the default cap (50): +// - cost(n) ~= 50 x (storage read + fee + token transfer_from + events) +// - at a configured cap of 5 the per-entry cost is identical; only `n` varies. +// The relevant ceiling enforced here is the batch-size check in `batch.rs`, +// which fires *before* any charging, so exceeding the cap panics with +// `ContractError::BatchTooLarge` (#20) rather than executing partial work. + +/// Batch-charge exactly the configured max batch size; all entries succeed. +#[test] +fn test_batch_charge_at_configured_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), batch_limit); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..batch_limit { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the configured max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_above_configured_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..=batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +/// Batch-charge the default max (50) without explicit configuration succeeds. +#[test] +fn test_batch_charge_at_default_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..50 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), 50); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..50u32 { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the default max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +// +// Issue #810: authorization-boundary tests +// +// Each admin entrypoint is tested in two states: +// (a) success with admin auth called via the normal client method inside +// `mock_all_auths` +// (b) panic when no admin is set called via try_* so the contract error is +// surfaced as an Err, not a hard panic +// +// Note: `setup()` enables `env.mock_all_auths()`, so a "non-admin rejected" +// variant cannot force `require_admin` to fail in this environment; rejection +// is instead covered by the no-admin panic path and the contract's own +// `require_admin` guard. +// + +// -- freeze_merchant ---------------------------------------------------------- + +/// Admin can freeze a merchant (happy path). +#[test] +fn test_freeze_merchant_admin_success() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.freeze_merchant(&merchant, &None); + + assert!(client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant panics when no admin has been set. +#[test] +fn test_freeze_merchant_no_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_freeze_merchant(&merchant, &None); + assert!(result.is_err()); +} + +// -- propose_fee -------------------------------------------------------------- + +/// Admin can propose a fee (happy path). +#[test] +fn test_propose_fee_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + + assert_eq!(client.get_fee(), None); +} + +/// propose_fee panics when no admin has been set. +#[test] +fn test_propose_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + let result = client.try_propose_fee(&collector, &100); + assert!(result.is_err()); +} + +// -- set_min_interval --------------------------------------------------------- + +/// Admin can set min_interval (happy path). +#[test] +fn test_set_min_interval_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_min_interval(&7200); + assert_eq!(client.get_min_interval(), 7200); +} + +/// set_min_interval panics when no admin has been set. +#[test] +fn test_set_min_interval_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_min_interval(&7200); + assert!(result.is_err()); +} + +// -- batch_cancel ------------------------------------------------------------- + +/// Admin can batch-cancel subscriptions (happy path). +#[test] +fn test_batch_cancel_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_cancel(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(!sub.active); +} + +/// batch_cancel panics when no admin has been set. +#[test] +fn test_batch_cancel_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_cancel(&users); + assert!(result.is_err()); +} + +// -- whitelist_batch_add ------------------------------------------------------ + +/// Admin can batch-add merchants to the whitelist (happy path). +#[test] +fn test_whitelist_batch_add_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + let added = client.whitelist_batch_add(&merchants); + assert_eq!(added, 2); +} + +/// whitelist_batch_add panics when no admin has been set. +#[test] +fn test_whitelist_batch_add_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.try_whitelist_batch_add(&merchants); + assert!(result.is_err()); +} + +// -- batch_pause_subscriptions ------------------------------------------------ + +/// Admin can batch-pause subscriptions (happy path). +#[test] +fn test_batch_pause_subscriptions_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_pause_subscriptions(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(sub.paused); +} + +/// batch_pause_subscriptions panics when no admin has been set. +#[test] +fn test_batch_pause_subscriptions_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_pause_subscriptions(&users); + assert!(result.is_err()); +} + +// -- clear_fee ---------------------------------------------------------------- + +/// Admin can clear fee (happy path). +#[test] +fn test_clear_fee_admin_success() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + assert!(client.get_fee().is_some()); + + client.clear_fee(); + assert_eq!(client.get_fee(), None); +} + +/// clear_fee panics when no admin has been set. +#[test] +fn test_clear_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_clear_fee(); + assert!(result.is_err()); +} + +// -- set_whitelist_enabled ---------------------------------------------------- + +/// Admin can toggle whitelist on/off (happy path). +#[test] +fn test_set_whitelist_enabled_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_whitelist_enabled(&true); + assert!(client.is_whitelist_enabled()); + + client.set_whitelist_enabled(&false); + assert!(!client.is_whitelist_enabled()); +} + +/// set_whitelist_enabled panics when no admin has been set. +#[test] +fn test_set_whitelist_enabled_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_whitelist_enabled(&true); + assert!(result.is_err()); +} + +// -- set_max_batch_size ------------------------------------------------------- + +/// Admin can set max_batch_size (happy path). +#[test] +fn test_set_max_batch_size_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_batch_size(&100); + assert_eq!(client.get_max_batch_size(), 100); +} + +/// set_max_batch_size panics when no admin has been set. +#[test] +fn test_set_max_batch_size_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_max_batch_size(&100); + assert!(result.is_err()); +} + +// -- pause_contract ----------------------------------------------------------- + +/// Admin can pause the contract (happy path). +#[test] +fn test_pause_contract_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.pause_contract(); + assert!(client.is_contract_paused()); +} + +/// pause_contract panics when no admin has been set. +#[test] +fn test_pause_contract_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_pause_contract(); + assert!(result.is_err()); +} + +// -- migrate ------------------------------------------------------------------ + +/// Admin can run storage migration (happy path). +#[test] +fn test_migrate_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +/// migrate panics when no admin has been set. +#[test] +fn test_migrate_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_migrate(&users); + assert!(result.is_err()); +} + +// -- set_global_volume_cap ---------------------------------------------------- + +/// Admin can set the global volume cap (happy path). +#[test] +fn test_set_global_volume_cap_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_global_volume_cap(&100_0000000); + assert_eq!(client.get_global_volume_cap(), 100_0000000); +} + +/// set_global_volume_cap panics when no admin has been set. +#[test] +fn test_set_global_volume_cap_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_global_volume_cap(&100_0000000); + assert!(result.is_err()); +} + + +#![cfg(test)] +#![allow( + clippy::bool_assert_comparison, + unused_variables, + dead_code, + clippy::inconsistent_digit_grouping +)] + +use super::*; +use soroban_sdk::{ + testutils::{Address as _, Events as _, Ledger}, + token::{Client as TokenClient, StellarAssetClient}, + Address, BytesN, Env, IntoVal, Symbol, TryFromVal, TryIntoVal, Vec, +}; + +/// Returns (env, contract_id, token_addr, user, merchant) +fn setup() -> (Env, Address, Address, Address, Address) { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + env.storage().instance().set(&DataKey::SchemaVersion, &3u32); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + (env, contract_id, token_addr, user, merchant) +} + +/// Helper: deploy second token +fn setup_second_token(env: &Env, contract_id: &Address, user: &Address) -> Address { + let token_admin = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let sac = StellarAssetClient::new(env, &token_addr); + sac.mint(user, &10_000_0000000); + + let token = TokenClient::new(env, &token_addr); + token.approve(user, contract_id, &10_000_0000000, &200000); + + token_addr +} + +fn setup_funded_user(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200); + + user +} + +fn assert_last_event(env: &Env, topic: &str) { + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let data_unit: () = data.try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(data_unit, ()); +} + +fn assert_last_user_event(env: &Env, topic: &str, user: &Address) { + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(env, topic)); + assert_eq!(topic_user, user.clone()); +} + +fn count_user_events(env: &Env, topic: &str, user: &Address) -> u32 { + let expected_topic = Symbol::new(env, topic); + let mut count = 0; + + for (_, topics, _) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol != expected_topic { + continue; + } + + let topic_user: Address = topics.get(1).unwrap().try_into_val(env).unwrap(); + if topic_user == user.clone() { + count += 1; + } + } + + count +} + +// ───────────────────────────────────────────── +// Core functionality tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_and_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!(sub.token, token_addr); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + assert!(sub_after.last_charged > 0); +} +#[test] +fn test_subscription_age_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + env.ledger().with_mut(|l| { + l.timestamp = 1; + }); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed: u64 = 1000; + env.ledger().with_mut(|l| { + l.timestamp += elapsed; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed)); +} + +#[test] +fn test_subscription_age_resets_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 5000; + }); + + client.cancel(&user); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let elapsed_after_resub: u64 = 200; + env.ledger().with_mut(|l| { + l.timestamp += elapsed_after_resub; + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, Some(elapsed_after_resub)); +} + +#[test] +fn test_subscription_age_none_when_no_subscription() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_subscription_age_none_for_migrated_sentinel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Simulate a pre-existing subscription migrated with the created_at = 0 sentinel + env.as_contract(&contract_id, || { + let key = crate::DataKey::Subscription(user.clone()); + let mut sub: crate::Subscription = env.storage().persistent().get(&key).unwrap(); + sub.created_at = 0; + env.storage().persistent().set(&key, &sub); + }); + + let age = client.get_subscription_age(&user); + assert_eq!(age, None); +} + +#[test] +fn test_batch_charge_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let results = client.batch_charge(&soroban_sdk::vec![&env]); + assert_eq!(results.len(), 0); +} + +/// charge() must decrease user balance and increase merchant balance by exactly the subscription amount. +#[test] +fn test_charge_exact_transfer_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by exactly the subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by exactly the subscription amount" + ); +} + +#[test] +fn test_charged_event_includes_ledger_sequence() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + l.sequence_number += 7; + }); + + client.charge(&user); + + let mut seen_charge_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "charged") { + let event_data: crate::events::ChargeEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.ledger_sequence, env.ledger().sequence()); + seen_charge_event = true; + } + } + + assert!(seen_charge_event, "expected a charged event"); +} + +#[test] +fn test_charge_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +#[test] +fn test_charge_routes_net_to_custom_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &500); + client.commit_fee(); // 5% + + // merchant sets a custom recipient (directly write persistent storage for test) + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&DataKey::MerchantFeeRecipient(merchant.clone()), &recipient); + env.storage().persistent().extend_ttl( + &DataKey::MerchantFeeRecipient(merchant.clone()), + SUBSCRIPTION_TTL_LEDGERS, + SUBSCRIPTION_TTL_LEDGERS, + ); + }); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let expected_net: i128 = amount - expected_fee; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let recipient_before = token.balance(&recipient); + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_fee); + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +// ───────────────────────────────────────────── +// CONTRACT-802: gross-allowance preflight before the two-leg fee transfer +// ───────────────────────────────────────────── + +/// Helper: installs an admin and commits `bps` with a fresh collector. +fn configure_fee(env: &Env, contract_id: &Address, bps: u32) -> Address { + let client = FlowPayClient::new(env, contract_id); + install_admin(env, contract_id); + let collector = Address::generate(env); + client.propose_fee(&collector, &bps); + client.commit_fee(); + collector +} + +/// An allowance exactly equal to the gross amount must cover BOTH transfer +/// legs (fee + net) when fee_bps > 0. +#[test] +fn test_charge_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Tighten the allowance to exactly the gross amount — not a stroop more. + token.approve(&user, &contract_id, &amount, &200000); + assert_eq!(token.allowance(&user, &contract_id), amount); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + // Both legs drew on the same allowance, consuming it exactly. + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// One stroop short of the gross amount must fail closed with the typed +/// `InsufficientAllowance` (#8) and move no funds on either leg. +#[test] +fn test_charge_allowance_below_gross_fails_closed_before_any_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &(amount - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let res = client.try_charge(&user); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + // Neither leg ran: the fee leg alone would have fit in the allowance. + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// A fee that rounds down to zero still charges the full gross amount and +/// needs the full gross allowance. +#[test] +fn test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + // 1 * 500 / 10_000 == 0 — the fee leg is skipped entirely. + let amount: i128 = 1; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), 0); + assert_eq!(token.balance(&merchant), amount); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +/// The maximum in-bounds fee (10_000 bps == 100%) sends everything to the +/// collector and still passes the single gross preflight. +#[test] +fn test_charge_max_bps_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 10_000); // 100% + + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + token.approve(&user, &contract_id, &amount, &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&collector), amount); + assert_eq!(token.balance(&merchant), 0); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +/// pay_per_use runs the same two-leg pattern and the same preflight. +#[test] +fn test_pay_per_use_exact_gross_allowance_succeeds_with_fee() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + let expected_fee: i128 = 500_0000; + token.approve(&user, &contract_id, &amount, &200000); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&collector), expected_fee); + assert_eq!(token.balance(&merchant), amount - expected_fee); + assert_eq!(token.allowance(&user, &contract_id), 0); +} + +#[test] +fn test_pay_per_use_allowance_below_gross_fails_closed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let collector = configure_fee(&env, &contract_id, 500); // 5% + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + let amount: i128 = 10_0000000; + token.approve(&user, &contract_id, &(amount - 1), &200000); + + let res = client.try_pay_per_use(&user, &amount); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(8)))); + assert_eq!(token.balance(&collector), 0); + assert_eq!(client.get_total_protocol_fees(), 0); +} + +// ───────────────────────────────────────────── +// Issue #837 / Issue 042: shared allowance-requirement helper +// ───────────────────────────────────────────── + +struct AllowanceReqCase { + allowance: i128, + gross: i128, + fee_bps: u32, + expected: bool, + label: &'static str, +} + +/// Table-driven unit tests for the shared allowance helper: zero, exact, and +/// insufficient allowance, plus fee-off vs fee-on gross (never net-only). +#[test] +fn test_allowance_covers_gross_table() { + let gross: i128 = 10_000; + let fee_on_bps: u32 = 500; // 5% + let fee_on_net: i128 = gross - (gross * fee_on_bps as i128 / 10_000); // 9_500 + + let cases = [ + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: 0, + expected: false, + label: "zero allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: 0, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "zero allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: 0, + expected: true, + label: "exact allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "exact gross allowance, fee_bps > 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: 0, + expected: false, + label: "insufficient (one stroop short), fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross - 1, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "insufficient (one stroop short of gross), fee_bps > 0", + }, + AllowanceReqCase { + allowance: fee_on_net, + gross, + fee_bps: fee_on_bps, + expected: false, + label: "fee-on net-only allowance is insufficient vs gross", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: 0, + expected: true, + label: "surplus allowance, fee_bps = 0", + }, + AllowanceReqCase { + allowance: gross + 1, + gross, + fee_bps: fee_on_bps, + expected: true, + label: "surplus allowance, fee_bps > 0", + }, + ]; + + for c in cases { + assert_eq!( + validation::required_allowance(c.gross, c.fee_bps), + c.gross, + "required allowance must be gross ({})", + c.label + ); + assert_eq!( + validation::allowance_covers_gross(c.allowance, c.gross, c.fee_bps), + c.expected, + "{}", + c.label + ); + } +} + +struct SimulateAllowanceCase { + fee_bps: u32, + allowance: i128, + expected: ChargeSimResult, + label: &'static str, +} + +/// `simulate_charge` uses the shared helper: fee-off and fee-on both require +/// the gross amount, so a net-only allowance fails when fees are on. +#[test] +fn test_simulate_charge_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let interval: u64 = 86400; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SimulateAllowanceCase { + fee_bps: 0, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "insufficient allowance, fee_bps = 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expected: ChargeSimResult::InsufficientAllowance, + label: "zero allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expected: ChargeSimResult::WouldSucceed, + label: "exact gross allowance, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount - 1, + expected: ChargeSimResult::InsufficientAllowance, + label: "one stroop short of gross, fee_bps > 0", + }, + SimulateAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expected: ChargeSimResult::InsufficientAllowance, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + token.approve(&user, &contract_id, &c.allowance, &200000); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + assert_eq!(client.simulate_charge(&user), c.expected, "{}", c.label); + } +} + +struct SubscribeAllowanceCase { + fee_bps: u32, + allowance: i128, + expect_ok: bool, + label: &'static str, +} + +/// subscribe() validation uses the same gross-allowance helper, including +/// when protocol fees are configured (requirement is still the gross amount). +#[test] +fn test_subscribe_allowance_requirement_table() { + let amount: i128 = 10_0000000; + let fee_on_bps: u32 = 500; + let fee_on_net: i128 = amount - (amount * fee_on_bps as i128 / 10_000); + + let cases = [ + SubscribeAllowanceCase { + fee_bps: 0, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount, + expect_ok: true, + label: "exact allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: 0, + allowance: amount - 1, + expect_ok: false, + label: "insufficient allowance, fee_bps = 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: 0, + expect_ok: false, + label: "zero allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: amount, + expect_ok: true, + label: "exact gross allowance, fee_bps > 0", + }, + SubscribeAllowanceCase { + fee_bps: fee_on_bps, + allowance: fee_on_net, + expect_ok: false, + label: "net-only allowance, fee_bps > 0", + }, + ]; + + for c in cases { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + if c.fee_bps > 0 { + configure_fee(&env, &contract_id, c.fee_bps); + } + + token.approve(&user, &contract_id, &c.allowance, &200000); + let result = + client.try_subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + if c.expect_ok { + assert!(result.is_ok(), "{}", c.label); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, amount, "{}", c.label); + } else { + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error(8))), + "{}", + c.label + ); + assert!( + client.get_subscription(&user).is_none(), + "failed subscribe must not write storage ({})", + c.label + ); + } + } +} + +/// `has_sufficient_allowance` reads SAC allowance and never transfers. +#[test] +fn test_has_sufficient_allowance_does_not_transfer() { + let (env, contract_id, token_addr, user, _merchant) = setup(); + let token = TokenClient::new(&env, &token_addr); + let amount: i128 = 1_0000000; + let balance_before = token.balance(&user); + + env.as_contract(&contract_id, || { + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + }); + + token.approve(&user, &contract_id, &0, &200000); + + env.as_contract(&contract_id, || { + assert!(!validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + amount + )); + assert!(validation::has_sufficient_allowance( + &env, + &user, + &token_addr, + 0 + )); + }); + + assert_eq!(token.balance(&user), balance_before); +} + +// Note: setter input validation is covered in contract code; invoking it directly +// via the generated client isn't available in these tests. The storage-level +// behavior for routing is covered by the tests above. + +#[test] +fn test_charge_with_zero_fee_bps_skips_fee_transfer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +/// subscribe() must store all Subscription fields exactly as provided. +#[test] +fn test_subscription_struct_fields_match_input() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + let subscribe_time = env.ledger().timestamp(); + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + + assert_eq!(sub.merchant, merchant, "merchant should match"); + assert_eq!(sub.amount, amount, "amount should match"); + assert_eq!(sub.interval, interval, "interval should match"); + assert!(sub.active, "subscription should be active"); + assert!(!sub.paused, "subscription should not be paused"); + assert_eq!(sub.token, token_addr, "token should match"); + // last_charged is set to subscribe time when no trial period + assert_eq!( + sub.last_charged, subscribe_time, + "last_charged should be set to subscribe time" + ); +} + +// ───────────────────────────────────────────── +// Issue #194: get_trial_end() tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_trial_end_with_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let now = env.ledger().timestamp(); + let trial_period: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(trial_period), + &None, + ); + + assert_eq!(client.get_trial_end(&user), Some(now + trial_period)); +} + +#[test] +fn test_get_trial_end_without_trial_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_trial_end(&user).is_none()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #6)")] +fn test_charge_before_trial_end_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &Some(86400u64), + &None, + ); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_subscribe_non_whitelisted_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_whitelisted_merchant_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.add_merchant(&merchant); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); + assert!(client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_is_merchant_whitelisted_returns_false_for_non_whitelisted() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +#[test] +fn test_set_whitelist_enabled_false_allows_any_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.set_whitelist_enabled(&true); + client.set_whitelist_enabled(&false); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant); +} + +#[test] +fn test_get_whitelist_enabled_defaults_to_true() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(client.get_whitelist_enabled()); +} + +#[test] +fn test_get_whitelist_enabled_toggles() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Default is true + assert!(client.get_whitelist_enabled()); + + // False after set_whitelist_enabled(false) + client.set_whitelist_enabled(&false); + assert!(!client.get_whitelist_enabled()); + + // True after re-enabling + client.set_whitelist_enabled(&true); + assert!(client.get_whitelist_enabled()); +} + +// ───────────────────────────────────────────── +// Merchant freeze tests +// ───────────────────────────────────────────── + +/// subscribe to a frozen merchant panics with ContractError::MerchantFrozen. +#[test] +#[should_panic(expected = "Error(Contract, #22)")] +fn test_subscribe_to_frozen_merchant_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// An existing subscriber can still be charged after their merchant is frozen — +/// freeze only blocks new subscriptions, not existing charge cycles. +#[test] +fn test_charge_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, interval + 1); +} + +/// pay_per_use is unaffected by merchant freeze status for an existing subscriber. +#[test] +fn test_pay_per_use_succeeds_after_merchant_frozen() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.freeze_merchant(&merchant, &None); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 1_0000000); +} + +/// is_merchant_frozen reflects freeze/unfreeze state changes. +#[test] +fn test_is_merchant_frozen_reflects_state() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert!(!client.is_merchant_frozen(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// Freezing a merchant that is not whitelisted must still succeed — the two +/// states (whitelist, freeze) are independent of each other. +#[test] +fn test_freeze_merchant_independent_of_whitelist() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Merchant is not whitelisted at all, and whitelist enforcement is off. + assert!(!client.is_merchant_whitelisted(&merchant)); + + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); + assert!(!client.is_merchant_whitelisted(&merchant)); +} + +/// freeze_merchant is idempotent — freezing an already-frozen merchant must not panic. +#[test] +fn test_freeze_merchant_idempotent() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.freeze_merchant(&merchant, &None); + client.freeze_merchant(&merchant, &None); + assert!(client.is_merchant_frozen(&merchant)); +} + +/// unfreeze_merchant on a non-frozen merchant must not panic. +#[test] +fn test_unfreeze_merchant_non_frozen_is_noop() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.unfreeze_merchant(&merchant); + assert!(!client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_freeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.freeze_merchant(&merchant, &None); +} + +/// unfreeze_merchant requires admin auth. +#[test] +#[should_panic] +fn test_unfreeze_merchant_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin configured — require_admin panics with "admin not set" + client.unfreeze_merchant(&merchant); +} + +#[test] +#[should_panic] +fn test_non_admin_add_and_remove_merchant_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.add_merchant(&merchant); + client.remove_merchant(&merchant); +} + +// ───────────────────────────────────────────── +// CONTRACT-20: whitelist_batch_add / whitelist_batch_remove tests +// ───────────────────────────────────────────── + +#[test] +fn test_whitelist_batch_add_three_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + merchants.push_back(m3.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 3); + assert!(client.is_merchant_whitelisted(&m1)); + assert!(client.is_merchant_whitelisted(&m2)); + assert!(client.is_merchant_whitelisted(&m3)); +} + +#[test] +fn test_whitelist_batch_remove_two_merchants() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + client.add_merchant(&m1); + client.add_merchant(&m2); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m2.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 2); + assert!(!client.is_merchant_whitelisted(&m1)); + assert!(!client.is_merchant_whitelisted(&m2)); +} + +#[test] +fn test_whitelist_batch_add_duplicates_does_not_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_add(&merchants); + + assert_eq!(count, 2); + assert!(client.is_merchant_whitelisted(&m1)); +} + +#[test] +fn test_whitelist_batch_remove_non_whitelisted_is_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(m1.clone()); + + let count = client.whitelist_batch_remove(&merchants); + + assert_eq!(count, 1); + assert!(!client.is_merchant_whitelisted(&m1)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic] +fn test_whitelist_batch_add_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut merchants = soroban_sdk::Vec::new(&env); + merchants.push_back(merchant.clone()); + client.whitelist_batch_add(&merchants); +} + +// ───────────────────────────────────────────── +// CONTRACT-803: configurable whitelist batch limit +// ───────────────────────────────────────────── + +/// Helper: installs a generated admin so admin-gated entrypoints are callable. +fn install_admin(env: &Env, contract_id: &Address) { + let admin = Address::generate(env); + env.as_contract(contract_id, || { + storage::set_admin(env, &admin); + }); +} + +/// Helper: installs an admin and returns a Vec of `n` freshly generated merchants. +fn whitelist_admin_and_merchants( + env: &Env, + contract_id: &Address, + n: u32, +) -> soroban_sdk::Vec
{ + install_admin(env, contract_id); + + let mut merchants = soroban_sdk::Vec::new(env); + for _ in 0..n { + merchants.push_back(Address::generate(env)); + } + merchants +} + +#[test] +fn test_max_whitelist_batch_size_defaults_to_50() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + assert_eq!(client.get_max_whitelist_batch_size(), 50); + // The whitelist knob is independent of the charge-batch knob. + client.set_max_batch_size(&10); + assert_eq!(client.get_max_whitelist_batch_size(), 50); + assert_eq!(client.get_max_batch_size(), 10); +} + +#[test] +fn test_set_max_whitelist_batch_size_lowers_cap() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + client.set_max_whitelist_batch_size(&2); + assert_eq!(client.get_max_whitelist_batch_size(), 2); + + // Exactly at the configured cap still succeeds. + assert_eq!(client.whitelist_batch_add(&merchants), 2); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_add_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_add(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_whitelist_batch_remove_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.whitelist_batch_remove(&merchants); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_over_configured_cap_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 3); + + client.set_max_whitelist_batch_size(&2); + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_raised_whitelist_batch_cap_allows_more_than_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 51); + + // 51 entries panic under the default cap; raising the cap admits them. + client.set_max_whitelist_batch_size(&60); + assert_eq!(client.whitelist_batch_add(&merchants), 51); + assert_eq!(client.get_whitelist_size(), 51); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_whitelist_batch_size_above_ceiling_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_whitelist_batch_size(&(MAX_BATCH_SIZE_CEILING + 1)); +} + +#[test] +#[should_panic] +fn test_set_max_whitelist_batch_size_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + client.set_max_whitelist_batch_size(&10); +} + +#[test] +fn test_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_referral_cleared_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.cancel(&user); + + assert_eq!(client.get_referrer(&user), None); +} + +#[test] +#[should_panic] +fn test_charge_too_early() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.charge(&user); +} + +// ───────────────────────────────────────────── +// Multi-token + advanced features +// ───────────────────────────────────────────── + +#[test] +fn test_multi_token_independent_subscriptions() { + let (env, contract_id, token_a, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let token_b = setup_second_token(&env, &contract_id, &user_b); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, &merchant, &amount, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user_b, &merchant, &amount, &interval, &token_b, &None, &None, + ); + + let sub_a = client.get_subscription(&user_a).unwrap(); + let sub_b = client.get_subscription(&user_b).unwrap(); + + assert_eq!(sub_a.token, token_a); + assert_eq!(sub_b.token, token_b); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); + client.charge(&user_b); +} + +#[test] +fn test_user_can_switch_token() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let token_b = setup_second_token(&env, &contract_id, &user); + let interval: u64 = 86400; + + client.subscribe( + &user, &merchant, &1_0000000, &interval, &token_a, &None, &None, + ); + client.subscribe( + &user, &merchant, &2_0000000, &interval, &token_b, &None, &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let token = TokenClient::new(&env, &token_addr); + let before = token.balance(&merchant); + + client.pay_per_use(&user, &5_0000000); + + assert_eq!(token.balance(&merchant), before + 5_0000000); +} + +#[test] +fn test_pay_per_use_applies_protocol_fee_and_records_net_revenue() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&merchant), expected_net); +} + +// ───────────────────────────────────────────── +// CONTRACT-23: pay_per_use_to tests +// ───────────────────────────────────────────── + +#[test] +fn test_pay_per_use_to_transfers_to_recipient_not_merchant() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 5_0000000; + let merchant_before = token.balance(&merchant); + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&merchant), merchant_before); + assert_eq!(token.balance(&recipient) - recipient_before, amount); + assert_eq!(client.get_merchant_revenue(&recipient), amount); + assert_eq!(client.get_merchant_revenue(&merchant), 0); +} + +#[test] +fn test_pay_per_use_to_applies_protocol_fee_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &250); + client.commit_fee(); // 2.5% + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 8_0000000; + let expected_fee: i128 = 200_0000; + let expected_net: i128 = amount - expected_fee; + let recipient_before = token.balance(&recipient); + let collector_before = token.balance(&collector); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, expected_net); + assert_eq!(token.balance(&collector) - collector_before, expected_fee); + assert_eq!(client.get_merchant_revenue(&recipient), expected_net); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_rejects_non_whitelisted_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.add_merchant(&merchant); + client.set_whitelist_enabled(&true); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let recipient = Address::generate(&env); // never whitelisted + client.pay_per_use_to(&user, &1_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + + client.pay_per_use_to(&user, &amount, &merchant); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_daily_limit_shared_with_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + + client.pay_per_use(&user, &6_0000000); + // Combined spend (6 + 6 = 12) exceeds the 10 limit, even though this + // second call routes through pay_per_use_to to a different recipient. + client.pay_per_use_to(&user, &6_0000000, &recipient); +} + +#[test] +fn test_pay_per_use_with_zero_fee_bps_transfers_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let admin = Address::generate(&env); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&collector, &0); + client.commit_fee(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 3_0000000; + let merchant_before = token.balance(&merchant); + let collector_before = token.balance(&collector); + + client.pay_per_use(&user, &amount); + + assert_eq!(token.balance(&merchant) - merchant_before, amount); + assert_eq!(token.balance(&collector) - collector_before, 0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pay_per_use(&user, &1_0000000); +} + +/// pay_per_use() must not update last_charged, confirming it is independent of the recurring billing cycle. +#[test] +fn test_pay_per_use_does_not_update_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + let last_charged_before = sub_before.last_charged; + + // Advance ledger time so we can verify last_charged isn't simply matching the current time + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; + }); + + client.pay_per_use(&user, &5_0000000); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.last_charged, last_charged_before, + "pay_per_use should not update last_charged" + ); +} + +#[test] +#[should_panic] +fn test_pay_per_use_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.pay_per_use(&random, &1_0000000); +} + +// ───────────────────────────────────────────── +// Edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_pay_per_use_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &0); +} + +#[test] +#[should_panic] +fn test_pay_per_use_exceeds_cap() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &(MAX_AMOUNT + 1)); +} + +/// initialize() still works for backward compat but is not required. +#[test] +fn test_initialize_backward_compat() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // initialize with a default token — should not affect per-sub token + client.initialize(&token_addr, &admin); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe(&user, &merchant, &1_0000000, &86400, &token_b, &None, &None); + + // Subscription uses token_b, not the initialized default + assert_eq!(client.get_subscription(&user).unwrap().token, token_b); +} + +// ── Issue #14: cancel nonexistent subscription ─────────────────────────────── + +/// cancel() must panic with "no subscription found" when called on a user with no subscription. +#[test] +#[should_panic] +fn test_cancel_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + client.cancel(&random); +} + +// ── Issue #13: get_subscription for nonexistent subscription ───────────────── + +/// get_subscription() must return None for an address with no subscription. +#[test] +fn test_get_subscription_nonexistent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription(&random).is_none(), + "get_subscription should return None for unknown address" + ); +} +// ── Issue #12: last_charged timestamp update ───────────────────────────────── + +/// charge() must update last_charged to the current ledger timestamp. +#[test] +fn test_charge_updates_last_charged() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 30 * 24 * 60 * 60; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Record the timestamp before advancing time + let subscribe_time = env.ledger().timestamp(); + + // Advance ledger time past interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1000; // advance by interval + 1000 seconds + }); + + // Record the timestamp right before charge + let charge_time = env.ledger().timestamp(); + assert!( + charge_time > subscribe_time, + "charge time should be after subscribe time" + ); + + client.charge(&user); + + let sub_after = client.get_subscription(&user).unwrap(); + // Verify last_charged is exactly equal to the charge_time + assert_eq!( + sub_after.last_charged, charge_time, + "last_charged should equal the ledger timestamp at charge time" + ); +} + +#[test] +#[should_panic] +fn test_zero_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &0, &86400, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_zero_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic] +fn test_interval_too_short() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &59, &token_addr, &None, &None); +} + +#[test] +fn test_interval_minimum_valid() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +// ───────────────────────────────────────────── +// Multi-user isolation +// ───────────────────────────────────────────── + +#[test] +fn test_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let merchant_b = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount_a: i128 = 1_0000000; + let amount_b: i128 = 2_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant_a, + &amount_a, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant_b, + &amount_b, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.charge(&user_a); +} + +// ───────────────────────────────────────────── +// Cancel + charge edge cases +// ───────────────────────────────────────────── + +#[test] +#[should_panic] +fn test_charge_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + client.charge(&user); +} + +// ───────────────────────────────────────────── +// batch_charge tests +// ───────────────────────────────────────────── + +#[test] +fn test_batch_charge_charged_and_skipped() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let interval: u64 = 86400; + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Only advance past interval for user_a + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // user_b re-subscribes at the new timestamp so their interval hasn't elapsed + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); +} + +#[test] +fn test_batch_charge_ordering() { + let (env, contract_id, token_addr, user_1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_2 = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_2, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_2, &contract_id, &10_000_0000000, &200); + + let user_3 = Address::generate(&env); + // user_3 has no subscription + + let user_4 = Address::generate(&env); + sac.mint(&user_4, &10_000_0000000); + token.approve(&user_4, &contract_id, &10_000_0000000, &200); + + let interval = 86400; + + // user_1: valid, will be charged + client.subscribe( + &user_1, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_2: valid, will be charged + client.subscribe( + &user_2, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe( + &user_4, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) + users.push_back(user_2.clone()); + users.push_back(user_3.clone()); + users.push_back(user_4.clone()); + users.push_back(user_1.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); + assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); +} + +#[test] +fn test_batch_charge_no_subscription() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(unknown); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::NoSubscription); +} + +#[test] +#[cfg(feature = "bench")] +fn test_batch_charge_stress() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + env.budget().reset_unlimited(); + + let num_users = 50; + let mut users = soroban_sdk::Vec::new(&env); + let interval = 86400; + + for _ in 0..num_users { + let u = Address::generate(&env); + sac.mint(&u, &10_000_0000000); + token.approve(&u, &contract_id, &10_000_0000000, &200); + client.subscribe( + &u, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), num_users); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } +} + +#[test] +#[cfg(feature = "bench")] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = Address::generate(&env); + users.push_back(u); + users.push_back(Address::generate(&env)); + } + + let res = client.try_batch_charge(&users); + assert!(res.is_err()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #29)")] +fn test_set_max_batch_size_rejects_value_above_200() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_max_batch_size(&201); +} + +#[test] +#[should_panic] +fn test_non_admin_set_max_batch_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.set_auths(&[]); + client.set_max_batch_size(&10); +} + +#[test] +fn test_cancel_and_refund_prorated_transfers_expected_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 900; + }); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 7_500_000 + ); + assert_eq!(token.balance(&user), user_balance_before + 7_500_000); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active); +} + +#[test] +fn test_cancel_and_refund_prorated_at_period_start_refunds_full_amount() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + + client.cancel_and_refund_prorated(&user, &merchant); + + assert_eq!( + token.balance(&merchant), + merchant_balance_before - 1_0000000 + ); + assert_eq!(token.balance(&user), user_balance_before + 1_0000000); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +#[should_panic(expected = "Error(Contract, #39)")] +fn test_cancel_and_refund_prorated_at_interval_end_rejects_zero_refund() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let sac = StellarAssetClient::new(&env, &token_addr); + + sac.mint(&merchant, &10_000_0000000); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp = 3600; + }); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #38)")] +fn test_cancel_and_refund_prorated_rejects_wrong_merchant() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let actual_merchant = Address::generate(&env); + + client.subscribe( + &user, + &actual_merchant, + &1_0000000, + &3600, + &_token_addr, + &None, + &None, + ); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_cancel_and_refund_prorated_missing_subscription_panics() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.cancel_and_refund_prorated(&user, &merchant); +} + +#[test] +fn test_cancel_and_refund_prorated_underfunded_merchant_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| l.timestamp = 1800); + + let merchant_balance_before = token.balance(&merchant); + let user_balance_before = token.balance(&user); + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert_eq!(token.balance(&merchant), merchant_balance_before); + assert_eq!(token.balance(&user), user_balance_before); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_inactive_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + assert!(!client.get_subscription(&user).unwrap().active); +} + +#[test] +fn test_cancel_and_refund_prorated_paused_subscription_is_atomic() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let result = client.try_cancel_and_refund_prorated(&user, &merchant); + + assert!(result.is_err()); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(sub.paused); +} + +#[test] +fn test_batch_charge_inactive() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Inactive); +} + +/// batch_charge must return ChargeResult::Paused for a subscription that has been paused. +#[test] +fn test_batch_charge_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Paused); +} + +/// Issue #201: batch_charge applies protocol fees identically to charge(). +#[test] +fn test_batch_charge_with_fee() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + let collector = Address::generate(&env); + let fee_bps: u32 = 100; // 1% + client.propose_fee(&collector, &fee_bps); + client.commit_fee(); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 10_000_000; // 1 XLM + let interval: u64 = 86400; + let expected_fee = amount * (fee_bps as i128) / 10_000; + let expected_net = amount - expected_fee; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_a_balance_before = token.balance(&user_a); + let user_b_balance_before = token.balance(&user_b); + let merchant_balance_before = token.balance(&merchant); + let collector_balance_before = token.balance(&collector); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Charged); + + assert_eq!( + user_a_balance_before - token.balance(&user_a), + amount, + "user_a debited gross amount" + ); + assert_eq!( + user_b_balance_before - token.balance(&user_b), + amount, + "user_b debited gross amount" + ); + assert_eq!( + token.balance(&merchant) - merchant_balance_before, + expected_net * 2, + "merchant receives net per user" + ); + assert_eq!( + token.balance(&collector) - collector_balance_before, + expected_fee * 2, + "collector receives fee per user" + ); +} + +#[test] +fn test_batch_charge_grace_period_elapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + let results = client.batch_charge(&users); + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::GracePeriodElapsed + ); +} + +// ----------------------------------------------------------------- +// Issue #794: batch_charge AllowanceInsufficient tolerance tests +// ----------------------------------------------------------------- + +/// A subscriber with zero allowance receives AllowanceInsufficient; no funds move. +#[test] +fn test_batch_charge_zero_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Revoke the allowance entirely. + token.approve(&user, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "zero allowance must produce AllowanceInsufficient" + ); + assert_eq!(token.balance(&user), user_balance_before, "user balance unchanged"); + assert_eq!(token.balance(&merchant), merchant_balance_before, "merchant balance unchanged"); +} + +/// A subscriber whose allowance is exactly the subscription amount is charged. +#[test] +fn test_batch_charge_exact_allowance_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the gross amount. + token.approve(&user, &contract_id, &amount, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::Charged, + "exact allowance must allow the charge" + ); + assert_eq!( + token.balance(&user), + 10_000_0000000 - amount, + "user debited gross amount" + ); +} + +/// A subscriber with allowance one stroop below sub.amount is rejected. +#[test] +fn test_batch_charge_one_below_allowance_returns_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Set allowance to one stroop below gross. + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); +} + +/// Mixed batch: Alice (sufficient) -> Bob (insufficient) -> Charlie (sufficient). +/// Bob's failure must not abort Alice's or Charlie's charges. +#[test] +fn test_batch_charge_mixed_allowance_does_not_abort_healthy_users() { + let (env, contract_id, token_addr, alice, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let bob = Address::generate(&env); + let charlie = Address::generate(&env); + sac.mint(&bob, &10_000_0000000); + sac.mint(&charlie, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&alice, &bob, &charlie] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + // Bob revokes to an insufficient amount. + token.approve(&bob, &contract_id, &(amount / 2), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let alice_before = token.balance(&alice); + let bob_before = token.balance(&bob); + let charlie_before = token.balance(&charlie); + let merchant_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(alice.clone()); + users.push_back(bob.clone()); + users.push_back(charlie.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged, "Alice charged"); + assert_eq!( + results.get(1).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "Bob insufficient" + ); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged, "Charlie charged"); + + assert_eq!(alice_before - token.balance(&alice), amount, "Alice debited"); + assert_eq!(token.balance(&bob), bob_before, "Bob untouched"); + assert_eq!(charlie_before - token.balance(&charlie), amount, "Charlie debited"); + assert_eq!( + token.balance(&merchant) - merchant_before, + amount * 2, + "merchant received exactly 2 charges" + ); +} + +/// Multiple under-allowanced users in one batch all return AllowanceInsufficient. +#[test] +fn test_batch_charge_multiple_insufficient_allowances() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let user_b = Address::generate(&env); + sac.mint(&user_b, &10_000_0000000); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + + for u in [&user_a, &user_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(u, &contract_id, &(amount - 1), &200); + } + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let a_before = token.balance(&user_a); + let b_before = token.balance(&user_b); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(token.balance(&user_a), a_before); + assert_eq!(token.balance(&user_b), b_before); +} + +/// Healthy user before AND after an under-allowanced user both get charged. +#[test] +fn test_batch_charge_healthy_before_and_after_insufficient() { + let (env, contract_id, token_addr, healthy_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + let insufficient = Address::generate(&env); + let healthy_b = Address::generate(&env); + sac.mint(&insufficient, &10_000_0000000); + sac.mint(&healthy_b, &10_000_0000000); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + for u in [&healthy_a, &insufficient, &healthy_b] { + token.approve(u, &contract_id, &10_000_0000000, &200); + client.subscribe(u, &merchant, &amount, &interval, &token_addr, &None, &None); + } + + token.approve(&insufficient, &contract_id, &0, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let ha_before = token.balance(&healthy_a); + let hb_before = token.balance(&healthy_b); + let ins_before = token.balance(&insufficient); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(healthy_a.clone()); + users.push_back(insufficient.clone()); + users.push_back(healthy_b.clone()); + let results = client.batch_charge(&users); + + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::AllowanceInsufficient); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Charged); + + assert_eq!(ha_before - token.balance(&healthy_a), amount); + assert_eq!(token.balance(&insufficient), ins_before); + assert_eq!(hb_before - token.balance(&healthy_b), amount); +} + +/// Auto-resume + insufficient allowance: subscription resumes but charge fails cleanly. +#[test] +fn test_batch_charge_auto_resume_with_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + client.pause_until(&user, &90_000); + + // Revoke allowance while paused. + token.approve(&user, &contract_id, &0, &200); + + // Advance past both the pause expiry and the charge interval. + env.ledger().set_timestamp(90_001); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "auto-resume + zero allowance must not panic" + ); + assert_eq!(token.balance(&user), user_balance_before); + assert_eq!(token.balance(&merchant), merchant_balance_before); + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert!(!sub.paused); +} + +/// get_batch_charge_estimate returns AllowanceInsufficient for an under-allowanced +/// due subscriber, mirroring the live batch behavior. +#[test] +fn test_batch_charge_estimate_reflects_allowance_insufficient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + token.approve(&user, &contract_id, &(amount - 1), &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::AllowanceInsufficient + ); +} + +/// Allowance check is against gross sub.amount, NOT the post-fee net amount. +/// Allowance == net (< gross) must still return AllowanceInsufficient. +#[test] +fn test_batch_charge_allowance_checked_against_gross_not_net() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let admin = Address::generate(&env); + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + crate::storage::set_admin(&env, &admin); + }); + // 10% fee: net = 90% of gross. + client.propose_fee(&collector, &1000); + client.commit_fee(); + + let gross: i128 = 1_0000000; + let net: i128 = gross - gross * 1000 / 10_000; // 9_000_000 + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &gross, &interval, &token_addr, &None, &None); + + // Set allowance to exactly the net amount -- below gross. + token.approve(&user, &contract_id, &net, &200); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let results = client.batch_charge(&users); + + assert_eq!( + results.get(0).unwrap(), + crate::ChargeResult::AllowanceInsufficient, + "allowance == net but < gross must still fail" + ); + assert_eq!(token.balance(&user), user_balance_before, "no funds moved"); +} + +// ───────────────────────────────────────────── +// subscription_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_active_count_increments_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_active_count(), 0); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); +} + +#[test] +fn test_active_count_does_not_double_count_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.merchant, merchant_b); + assert_eq!(sub.amount, 2_0000000); +} + +#[test] +fn test_active_count_decrements_on_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 1); + client.cancel(&user); + assert_eq!(client.get_active_count(), 0); +} + +#[test] +fn test_active_count_multiple_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_active_count(), 2); + + client.cancel(&user_a); + assert_eq!(client.get_active_count(), 1); +} + +// ───────────────────────────────────────────── +// merchant_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_from_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_merchant_revenue(&merchant), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_merchant_revenue(&merchant), amount); +} + +#[test] +fn test_merchant_revenue_from_pay_per_use() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &3_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +#[test] +fn test_merchant_revenue_accumulates() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 2_0000000; + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + client.pay_per_use(&user, &1_0000000); + + assert_eq!(client.get_merchant_revenue(&merchant), 3_0000000); +} + +// ───────────────────────────────────────────── +// spending_limit tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_daily_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Initial limit should be None + assert_eq!(client.get_daily_limit(&user), None); + + // After setting, it should return Some(limit) + client.set_daily_limit(&user, &10_0000000); + assert_eq!(client.get_daily_limit(&user), Some(10_0000000)); +} + +#[test] +fn test_get_daily_limit_status_absent_limit() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: None, + spent: 0, + day_start: None, + remaining: None, + } + ); +} + +#[test] +fn test_get_daily_limit_status_snapshot_and_rollover() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + client.pay_per_use(&user, &2_0000000); + + let status = client.get_daily_limit_status(&user); + assert_eq!(status.limit, Some(10_0000000)); + assert_eq!(status.spent, 2_0000000); + assert_eq!(status.remaining, Some(8_0000000)); + assert_eq!(status.day_start, client.get_day_start(&user)); + + env.as_contract(&contract_id, || { + env.storage().temporary().extend_ttl( + &DataKey::DailyLimit(user.clone()), + 35000, + 35000, + ); + }); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += 17281; + }); + + assert_eq!( + client.get_daily_limit_status(&user), + DailyLimitStatus { + limit: Some(10_0000000), + spent: 0, + day_start: None, + remaining: Some(10_0000000), + } + ); +} + +#[test] +fn test_daily_limit_allows_spend_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &10_0000000); + // Should not panic + client.pay_per_use(&user, &5_0000000); +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &5_0000000); +} + +#[test] +fn test_daily_limit_accumulates_across_calls() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &2_0000000); + client.pay_per_use(&user, &2_0000000); + // 4 total, limit is 5 — should pass +} + +#[test] +#[should_panic] +fn test_daily_limit_blocks_cumulative_overspend() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + client.pay_per_use(&user, &3_0000000); + client.pay_per_use(&user, &3_0000000); // 6 total > 5 limit +} + +#[test] +fn test_daily_limit_visibility_and_spend_tracking() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_daily_limit(&user), None); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &4_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); + + client.pay_per_use(&user, &1_0000000); + assert_eq!(client.get_daily_spent(&user), 1_0000000); + assert_eq!(client.get_daily_limit(&user), Some(4_0000000)); +} + +#[test] +fn test_get_day_start_visibility() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // No window before any spend + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); + + client.set_daily_limit(&user, &10_0000000); + // Setting a limit alone does not open the day window + assert!(client.get_day_start(&user).is_none()); + + client.pay_per_use(&user, &2_0000000); + assert!(client.get_day_start(&user).is_some()); + assert_eq!(client.get_daily_spent(&user), 2_0000000); + + client.remove_daily_limit(&user); + assert!(client.get_day_start(&user).is_none()); + assert_eq!(client.get_daily_spent(&user), 0); +} + +#[test] +fn test_daily_limit_set_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let limit: i128 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "daily_limit_set")); + assert_eq!(topic_user, user); + assert_eq!(limit, 4_0000000); +} + +#[test] +fn test_daily_limit_removed_event_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.set_daily_limit(&user, &4_0000000); + client.remove_daily_limit(&user); + + assert_eq!(client.get_daily_limit(&user), None); + assert_last_user_event(&env, "daily_limit_removed", &user); +} + +#[test] +fn test_remove_daily_limit_allows_pay_per_use_after_removal() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &3_0000000); + client.pay_per_use(&user, &2_0000000); + client.remove_daily_limit(&user); + client.pay_per_use(&user, &2_0000000); // should succeed after removal +} + +// ───────────────────────────────────────────── +// Contract admin event tests +// ───────────────────────────────────────────── + +#[test] +fn test_contract_pause_events_emitted() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.pause_contract(); + assert!(client.is_contract_paused()); + assert_last_event(&env, "contract_paused"); + + client.unpause_contract(); + assert!(!client.is_contract_paused()); + assert_last_event(&env, "contract_unpaused"); +} + +// ───────────────────────────────────────────── +// Migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_v1_to_v2() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::SchemaVersion, &1u32); + }); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Manually construct and store a V1 subscription + let v1_sub = crate::migration::SubscriptionV1 { + merchant: merchant.clone(), + amount: 1_0000000, + interval: 86400, + last_charged: env.ledger().timestamp(), + active: true, + token: token_addr.clone(), + referrer: None, + label: Symbol::new(&env, "v1_label"), + trial_duration: 0, + }; + + env.as_contract(&contract_id, || { + env.storage() + .persistent() + .set(&crate::DataKey::Subscription(user.clone()), &v1_sub); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + // Verify it was upgraded to V2 + let v2_sub = client.get_subscription(&user).unwrap(); + assert_eq!(v2_sub.merchant, merchant); + assert_eq!(v2_sub.amount, 1_0000000); + assert_eq!(v2_sub.active, true); + assert_eq!(v2_sub.paused, false); // This is the newly added field + assert_eq!(v2_sub.label, Symbol::new(&env, "v1_label")); +} + +#[test] +fn test_admin_batch_pause_subscriptions_freezes_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 1); +} + +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + + let mut users = Vec::new(&env); + users.push_back(missing_user.clone()); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + client.batch_pause_subscriptions(&users); + + assert!(client.get_subscription(&user_a).unwrap().paused); + assert!(client.get_subscription(&user_b).unwrap().paused); + assert!(client.get_subscription(&missing_user).is_none()); + assert_eq!(count_user_events(&env, "subscription_paused", &user_a), 1); + assert_eq!(count_user_events(&env, "subscription_paused", &user_b), 0); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let mut users = Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_upgrade_event_emitted() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[7; 32]); + client.upgrade(&new_wasm_hash); + + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let mock_wasm_hash = BytesN::from_array(&env, &[0u8; 32]); + env.as_contract(&contract_id, || { + events::publish_upgraded(&env, &mock_wasm_hash); + }); + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "upgrade")); +} + +// ───────────────────────────────────────────────────────────── +// Issue #45: get_pending_upgrade tests +// ───────────────────────────────────────────────────────────── + +/// Returns None when no upgrade has been proposed. +#[test] +fn test_get_pending_upgrade_none_when_not_proposed() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert_eq!(client.get_pending_upgrade(), None); +} + +/// Returns the proposed WASM hash after propose_upgrade is called. +#[test] +fn test_get_pending_upgrade_returns_proposed_hash() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xAB; 32]); + client.propose_upgrade(&new_wasm_hash); + + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); +} + +/// Returns None after commit_upgrade consumes the pending hash. +#[test] +fn test_get_pending_upgrade_none_after_commit() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xCD; 32]); + client.propose_upgrade(&new_wasm_hash); + + // Hash is visible before commit + assert_eq!(client.get_pending_upgrade(), Some(new_wasm_hash)); + + client.commit_upgrade(); + + // Cleared after commit + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_cancel_pending_upgrade_clears_pending_upgrade_and_emits_event() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let new_wasm_hash = BytesN::from_array(&env, &[0xEF; 32]); + client.propose_upgrade(&new_wasm_hash); + client.cancel_pending_upgrade(); + + assert_eq!(client.get_pending_upgrade(), None); + assert_last_event(&env, "upg_cancelled"); +} + +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_upgrade_requires_pending_upgrade_after_cancel() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + client.cancel_pending_upgrade(); + client.commit_upgrade(); +} + +#[test] +fn test_pending_upgrade_expires() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + client.propose_upgrade(&BytesN::from_array(&env, &[0xEF; 32])); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS + 1; + }); + + assert_eq!(client.get_pending_upgrade(), None); +} + +#[test] +fn test_repropose_refreshes_pending_upgrade_ttl() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let first_hash = BytesN::from_array(&env, &[0x01; 32]); + let second_hash = BytesN::from_array(&env, &[0x02; 32]); + client.propose_upgrade(&first_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + client.propose_upgrade(&second_hash); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += upgrade::PENDING_UPGRADE_TTL_LEDGERS - 1; + }); + + assert_eq!(client.get_pending_upgrade(), Some(second_hash)); +} + +/// A second propose_upgrade overwrites the first pending hash. +#[test] +fn test_get_pending_upgrade_overwritten_by_second_proposal() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let hash_a = BytesN::from_array(&env, &[0x01; 32]); + let hash_b = BytesN::from_array(&env, &[0x02; 32]); + + client.propose_upgrade(&hash_a); + assert_eq!(client.get_pending_upgrade(), Some(hash_a)); + + client.propose_upgrade(&hash_b); + assert_eq!(client.get_pending_upgrade(), Some(hash_b)); +} +// ───────────────────────────────────────────── +// ───────────────────────────────────────────────────────────── +// Issue #96: referral tracking tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_referral_stored_on_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + assert_eq!(client.get_referrer(&user), Some(referrer)); +} + +#[test] +fn test_no_referral_returns_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_referral_updates_on_resubscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer_a = Address::generate(&env); + let referrer_b = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer_a.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_a)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &Some(referrer_b.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer_b)); +} + +#[test] +fn test_grace_period_ttl_extension() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Ensure an admin is set so admin checks pass. + let admin = Address::generate(&env); + // Write admin as the contract to set instance storage from the test harness. + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + // Set a grace period as admin and verify read returns the same value. + let seconds: u64 = 3600; + client.propose_grace_period(&seconds); + client.commit_grace_period(); + let got = client.get_grace_period(); + assert_eq!(got, seconds); +} + +#[test] +#[should_panic(expected = "Error(Contract, #1)")] +fn test_double_initialize() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.initialize(&token_addr, &admin); +} + +// ───────────────────────────────────────────── +// Issue #839 / Issue 044: deploy-facing initialize invariants +// Relied on by scripts/deploy-pipeline.ts and scripts/testnet-setup.ts. +// Signature must remain initialize(token, admin). Failures that scripts map +// must be ContractError (AlreadyInitialized = 1), not a host string panic. +// ───────────────────────────────────────────── + +/// Successful initialize persists both the default token and the admin. +/// Deploy health checks require `token_configured` and `admin_configured`. +#[test] +fn test_initialize_deploy_invariant_persists_token_and_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + assert_eq!( + client.get_token(), + Some(token_addr.clone()), + "initialize must persist the token readable via get_token" + ); + assert_eq!( + client.get_admin(), + Some(admin.clone()), + "initialize must persist the admin readable via get_admin" + ); + + let report = client.contract_health_check(); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +/// Every published error code remains stable on the Soroban wire format. +#[test] +fn test_published_error_code_mapping() { + use crate::errors::ContractError; + + let published = [ + (ContractError::AlreadyInitialized, 1), + (ContractError::AmountMustBePositive, 2), + (ContractError::IntervalMustBePositive, 3), + (ContractError::NoSubscriptionFound, 4), + (ContractError::SubscriptionInactive, 5), + (ContractError::IntervalNotElapsed, 6), + (ContractError::NotInitialized, 7), + (ContractError::InsufficientAllowance, 8), + (ContractError::GracePeriodElapsed, 9), + (ContractError::MerchantNotWhitelisted, 10), + (ContractError::SelfReferral, 11), + (ContractError::InvalidTokenAddress, 12), + (ContractError::InvalidFeeBps, 13), + (ContractError::MetadataLabelTooLong, 14), + (ContractError::AmountExceedsMaximum, 15), + (ContractError::SubscriptionNotActive, 16), + (ContractError::SubscriptionPaused, 17), + (ContractError::ContractPaused, 18), + (ContractError::IntervalTooShort, 19), + (ContractError::BatchTooLarge, 20), + (ContractError::ZeroBalanceAvailable, 21), + (ContractError::MerchantFrozen, 22), + (ContractError::NoPendingProposal, 23), + (ContractError::SubscriptionAlreadyActive, 24), + (ContractError::DailyLimitExceeded, 25), + (ContractError::InvalidFeeCollector, 26), + (ContractError::InvalidPauseExpiry, 27), + (ContractError::GlobalVolumeExceeded, 28), + (ContractError::InvalidBatchSize, 29), + (ContractError::InvalidRecipient, 32), + (ContractError::InvalidVolumeCap, 33), + (ContractError::InvalidFeeBounds, 34), + (ContractError::FeeOutOfBoundsAtCommit, 35), + (ContractError::ArithmeticOverflow, 36), + (ContractError::RefundMerchantMismatch, 38), + (ContractError::RefundAmountMustBePositive, 39), + (ContractError::InsufficientMerchantBalance, 40), + (ContractError::CannotClearActiveSubscriber, 41), + (ContractError::SchemaMigrationRequired, 42), + (ContractError::ResumeGraceLapsed, 43), + ]; + + for (error, code) in published { + assert_eq!(error as u32, code); + assert_eq!(soroban_sdk::Error::from_contract_error(code), soroban_sdk::Error::from_contract_error(error as u32)); + } + + // Code 30 remains source-compatible for clients that referenced the old + // variant, but no current pause path emits it. Code 31 is intentionally + // reserved and has no current enum variant. + #[allow(deprecated)] + { + assert_eq!(ContractError::ContractPausedError as u32, 30); + } + assert!(!published.iter().any(|(_, code)| *code == 31)); + assert!(!published.iter().any(|(_, code)| *code == 30)); +} + +/// Storage read used by deploy scripts: get_admin returns the initialized admin. +#[test] +fn test_initialize_deploy_invariant_stored_admin() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Storage read used by deploy scripts: get_token returns the initialized token. +#[test] +fn test_initialize_deploy_invariant_stored_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_token().is_none()); + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +/// A second initialize must return typed AlreadyInitialized (code 1), not a string panic. +#[test] +fn test_initialize_deploy_invariant_double_init_already_initialized() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + + let result = client.try_initialize(&token_addr, &admin); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "double initialize must map to ContractError::AlreadyInitialized" + ); + + // First initialize state is unchanged. + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// Initialize without admin authorization must fail and must not persist token or admin. +#[test] +fn test_initialize_deploy_invariant_requires_admin_auth() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_initialize(&token_addr, &admin); + assert!(result.is_err(), "initialize without admin auth must fail"); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AlreadyInitialized as u32 + ))), + "missing admin auth is an authorization failure, not AlreadyInitialized" + ); + + assert!( + client.get_token().is_none(), + "failed initialize must not persist token" + ); + assert!( + client.get_admin().is_none(), + "failed initialize must not persist admin" + ); +} + +/// Backward-compat: current initialize(token, admin) arity remains the deploy entrypoint. +#[test] +fn test_initialize_deploy_invariant_token_admin_signature() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); + assert_eq!(client.get_admin(), Some(admin)); +} + +#[test] +fn test_referral_clears_on_resubscribe_with_none() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let referrer = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referrer(&user), Some(referrer)); + + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + assert!(client.get_referrer(&user).is_none()); +} + +#[test] +fn test_self_referral_rejected_via_try_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(user.clone()), + ); + + assert_eq!(result, Err(Ok(soroban_sdk::Error::from_contract_error(11)))); +} + +// ───────────────────────────────────────────── +// Issue #97: migration tests +// ───────────────────────────────────────────── + +#[test] +fn test_migrate_sets_schema_version() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Fresh contract starts at schema version 0 before migration. + assert_eq!(client.get_schema_version(), 0); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +fn test_migrate_is_idempotent() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + client.migrate(&empty_users); // second call should be a no-op + + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────── +#[test] +#[should_panic] +fn test_migrate_non_admin_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); +} + +#[test] +fn test_migrate_emits_completed_event_with_version_and_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.migrate(&users); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (version, user_count): (u32, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "migration_completed")); + assert_eq!(version, 3); + assert_eq!(user_count, 1); +} + +// ───────────────────────────────────────────── +// Issue #99: subscription metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_set_and_get_metadata() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +fn test_clear_metadata_removes_label() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let label = soroban_sdk::String::from_str(&env, "pro"); + client.set_metadata(&user, &label); + assert_eq!(client.get_metadata(&user), Some(label)); + + client.clear_metadata(&user); + + assert!(client.get_metadata(&user).is_none()); +} + +#[test] +fn test_get_metadata_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.get_metadata(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Issue #98: charge history tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_charge_history_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. A fresh user with no subscription/no charges ever → count is 0. + let fresh_user = Address::generate(&env); + assert_eq!(client.get_charge_history_count(&fresh_user), 0); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Also checking count for user with active subscription but no charges yet + assert_eq!(client.get_charge_history_count(&user), 0); + + // 2. Count increments by 1 correctly after each individual charge event. + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 1); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + assert_eq!(client.get_charge_history_count(&user), 2); + + // Charge more to get exactly 12 entries + for _ in 0..10 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + // 5. (Edge case) A user with exactly 12 entries → returns exactly 12. + assert_eq!(client.get_charge_history_count(&user), 12); + + // 3. Count caps at 12 and does not exceed it even after more than 12 charges have occurred. + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + assert_eq!(client.get_charge_history_count(&user), 12); + + // 4. After calling clear_charge_history for a user who had history, count returns to 0. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.clear_charge_history(&user); + assert_eq!(client.get_charge_history_count(&user), 0); +} + +#[test] +fn test_charge_history_recorded() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_charge_history(&user).len(), 0); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); +} + +#[test] +fn test_charge_history_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Perform 14 charges + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + assert_eq!(client.get_charge_history(&user).len(), 12); +} + +#[test] +fn test_get_charge_history_three_charges_ascending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let history = client.get_charge_history(&user); + assert_eq!(history.len(), 3); + assert_eq!(history.get(0).unwrap(), t1); + assert_eq!(history.get(1).unwrap(), t2); + assert_eq!(history.get(2).unwrap(), t3); +} + +#[test] +fn test_get_charge_history_page_offset_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t1 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t2 = env.ledger().timestamp(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t3 = env.ledger().timestamp(); + + let page = client.get_charge_history_page(&user, &1u32, &2u32, &true); + assert_eq!(page.len(), 2); + assert_eq!(page.get(0).unwrap(), t2); + assert_eq!(page.get(1).unwrap(), t3); +} + +#[test] +#[should_panic] +fn test_clear_charge_history_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + client.clear_charge_history(&user); +} + +#[test] +fn test_clear_charge_history_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + assert_eq!(client.get_charge_history(&user).len(), 1); + + client.clear_charge_history(&user); + + assert_eq!(client.get_charge_history(&user).len(), 0); +} + +#[test] +fn test_get_charge_history_empty_for_no_history() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + let history = client.get_charge_history(&random); + assert_eq!(history.len(), 0); +} + +#[test] +fn test_get_charge_history_page_limit_capped_at_12() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + for _ in 0..14 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + } + + let page = client.get_charge_history_page(&user, &0u32, &100u32, &true); + assert_eq!(page.len(), 12); +} + +#[test] +fn test_get_charge_history_page_offset_beyond_length() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let page = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(page.len(), 0); +} + +#[test] +fn test_charge_history_sort_ascending_and_descending() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let mut timestamps = Vec::new(&env); + for _ in 0..5 { + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + timestamps.push_back(env.ledger().timestamp()); + } + + let t0 = timestamps.get(0).unwrap(); + let t1 = timestamps.get(1).unwrap(); + let t2 = timestamps.get(2).unwrap(); + let t3 = timestamps.get(3).unwrap(); + let t4 = timestamps.get(4).unwrap(); + + // Ascending (true) full page: [t0, t1, t2, t3, t4] + let asc_all = client.get_charge_history_page(&user, &0u32, &10u32, &true); + assert_eq!(asc_all.len(), 5); + assert_eq!(asc_all.get(0).unwrap(), t0); + assert_eq!(asc_all.get(1).unwrap(), t1); + assert_eq!(asc_all.get(2).unwrap(), t2); + assert_eq!(asc_all.get(3).unwrap(), t3); + assert_eq!(asc_all.get(4).unwrap(), t4); + + // Descending (false) full page: [t4, t3, t2, t1, t0] + let desc_all = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(desc_all.len(), 5); + assert_eq!(desc_all.get(0).unwrap(), t4); + assert_eq!(desc_all.get(1).unwrap(), t3); + assert_eq!(desc_all.get(2).unwrap(), t2); + assert_eq!(desc_all.get(3).unwrap(), t1); + assert_eq!(desc_all.get(4).unwrap(), t0); + + // Pagination in ascending direction: + let asc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &true); + assert_eq!(asc_p1.len(), 2); + assert_eq!(asc_p1.get(0).unwrap(), t0); + assert_eq!(asc_p1.get(1).unwrap(), t1); + + let asc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &true); + assert_eq!(asc_p2.len(), 2); + assert_eq!(asc_p2.get(0).unwrap(), t2); + assert_eq!(asc_p2.get(1).unwrap(), t3); + + let asc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &true); + assert_eq!(asc_p3.len(), 1); + assert_eq!(asc_p3.get(0).unwrap(), t4); + + let asc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &true); + assert_eq!(asc_p4.len(), 0); + + // Pagination in descending direction: + let desc_p1 = client.get_charge_history_page(&user, &0u32, &2u32, &false); + assert_eq!(desc_p1.len(), 2); + assert_eq!(desc_p1.get(0).unwrap(), t4); + assert_eq!(desc_p1.get(1).unwrap(), t3); + + let desc_p2 = client.get_charge_history_page(&user, &2u32, &2u32, &false); + assert_eq!(desc_p2.len(), 2); + assert_eq!(desc_p2.get(0).unwrap(), t2); + assert_eq!(desc_p2.get(1).unwrap(), t1); + + let desc_p3 = client.get_charge_history_page(&user, &4u32, &2u32, &false); + assert_eq!(desc_p3.len(), 1); + assert_eq!(desc_p3.get(0).unwrap(), t0); + + let desc_p4 = client.get_charge_history_page(&user, &5u32, &2u32, &false); + assert_eq!(desc_p4.len(), 0); +} + +#[test] +fn test_charge_history_sort_edge_cases() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + // Empty history + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &true) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &0u32, &10u32, &false) + .len(), + 0 + ); + assert_eq!( + client + .get_charge_history_page(&random, &5u32, &10u32, &false) + .len(), + 0 + ); + + // Single entry + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + let t0 = env.ledger().timestamp(); + + let asc_single = client.get_charge_history_page(&user, &0u32, &10u32, &true); + let desc_single = client.get_charge_history_page(&user, &0u32, &10u32, &false); + assert_eq!(asc_single.len(), 1); + assert_eq!(desc_single.len(), 1); + assert_eq!(asc_single.get(0).unwrap(), t0); + assert_eq!(desc_single.get(0).unwrap(), t0); +} + +#[test] +fn test_clear_charge_history_nonexistent_key_no_panic() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.clear_charge_history(&random); +} + +// ───────────────────────────────────────────── +// contract_health_check tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_initialized_unpaused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!( + report.is_healthy, + "initialized and unpaused contract should be healthy" + ); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); +} + +#[test] +fn test_health_check_paused() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy, "paused contract should not be healthy"); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_pre_initialize() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!( + !report.token_configured, + "token should not be configured before initialize" + ); + assert!( + !report.is_healthy, + "uninitialized contract should not be healthy" + ); +} + +#[test] +fn test_health_check_active_subscription_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let report = client.contract_health_check(); + assert_eq!(report.active_subscription_count, 1); +} + +// ───────────────────────────────────────────── +// Issue 010: HealthReport field cleanup tests +// ───────────────────────────────────────────── + +#[test] +fn test_health_check_healthy_fully_configured() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + + assert!(report.is_healthy); + assert!(!report.contract_paused); + assert!(report.token_configured); + assert!(report.admin_configured); + assert!(report.instance_ttl_ledgers > 0); + // pending_merchant_rev_count is 0 when no merchants have revenue + assert_eq!(report.pending_merchant_rev_count, 0); +} + +#[test] +fn test_health_check_paused_not_healthy() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.pause_contract(); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(report.contract_paused); +} + +#[test] +fn test_health_check_unconfigured_not_healthy() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let report = client.contract_health_check(); + + assert!(!report.is_healthy); + assert!(!report.token_configured); + assert!(!report.admin_configured); +} + +/// Verify that TTL is reported as a positive value (test builds use real get_ttl). +#[test] +fn test_health_check_ttl_is_positive() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let report = client.contract_health_check(); + assert!( + report.instance_ttl_ledgers > 0, + "instance_ttl_ledgers should be positive in test builds" + ); +} + +#[test] +fn test_ttl_extension() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // We can't easily assert the exact TTL in the test environment without more complex mock_all_auths + // or internal access, but we can verify the function exists and doesn't panic. + + // Keep the contract instance itself alive across the jump below — only the + // Subscription entry's TTL is extended by extend_subscription_ttl, but the + // contract instance needs its own TTL or the whole contract becomes archived. + // Extend a bit past SUBSCRIPTION_TTL_LEDGERS to cover the two ledger jumps below. + env.as_contract(&contract_id, || { + env.storage() + .instance() + .extend_ttl(SUBSCRIPTION_TTL_LEDGERS + 10, SUBSCRIPTION_TTL_LEDGERS + 10); + }); + + env.ledger().with_mut(|l| { + l.sequence_number += SUBSCRIPTION_TTL_LEDGERS - 1; + }); + + client.extend_subscription_ttl(&user); + + assert!(client.get_subscription(&user).is_some()); +} + +// ───────────────────────────────────────────── +// Issue 013: PauseExpiry TTL coupled with subscription bump +// ───────────────────────────────────────────── + +#[test] +fn test_bump_subscription_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Verify PauseExpiry exists before bump + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should exist after pause_until"); + }); + + // Bump subscription TTL — should also bump PauseExpiry + client.bump_subscription(&user); + + // PauseExpiry should still exist (not archived) + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive bump_subscription"); + assert_eq!(expiry.unwrap(), 90000); + }); +} + +#[test] +fn test_bump_subscription_no_op_on_absent_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // No PauseExpiry — bump should be a safe no-op + client.bump_subscription(&user); + + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(expiry, None, "PauseExpiry should remain absent"); + }); +} + +#[test] +fn test_batch_extend_extends_pause_expiry_when_present() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &200000); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // PauseExpiry should survive batch extend + env.as_contract(&contract_id, || { + let expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert!(expiry.is_some(), "PauseExpiry should survive batch_extend"); + assert_eq!(expiry.unwrap(), 200000); + }); +} + +#[test] +fn test_pause_then_batch_extend_then_auto_resume() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.ledger().with_mut(|l| { + l.max_entry_ttl = 10_000_000; + }); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + // Batch extend keeps PauseExpiry alive + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_extend_subscription_ttl(&users); + + // Advance to expiry — auto-resume should still work + env.ledger().set_timestamp(90000); + let mut users2 = soroban_sdk::Vec::new(&env); + users2.push_back(user.clone()); + let result = client.batch_charge(&users2); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); +} + +// ───────────────────────────────────────────── +// CONTRACT-22: bump_instance_ttl tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_extends_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS / 2); +} + +#[test] +fn test_initialize_sets_instance_ttl() { + use soroban_sdk::testutils::storage::Instance as _; + + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin); + let admin = Address::generate(&env); + + client.initialize(&token_id.address(), &admin); + + let ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl > 0); +} + +#[test] +fn test_bump_instance_ttl_is_permissionless_and_state_preserving() { + use soroban_sdk::testutils::storage::Instance as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + env.ledger().with_mut(|ledger| { + ledger.max_entry_ttl = SUBSCRIPTION_TTL_LEDGERS * 2; + }); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let admin_before = client.get_admin(); + let token_before = client.get_token(); + let fee_before = client.get_fee(); + let subscription_before = client.get_subscription(&user); + env.ledger().with_mut(|ledger| { + ledger.sequence_number += SUBSCRIPTION_TTL_LEDGERS / 2 + 100; + }); + let ttl_before = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + + env.set_auths(&[]); + client.bump_instance_ttl(); + + let ttl_after = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(ttl_after > ttl_before); + assert!(ttl_after >= SUBSCRIPTION_TTL_LEDGERS); + assert_eq!(client.get_admin(), admin_before); + assert_eq!(client.get_token(), token_before); + assert_eq!(client.get_fee(), fee_before); + assert_eq!(client.get_subscription(&user), subscription_before); + + client.bump_instance_ttl(); + let repeated_ttl = env.as_contract(&contract_id, || env.storage().instance().get_ttl()); + assert!(repeated_ttl >= ttl_after); +} + +#[test] +#[should_panic] +fn test_subscribe_interval_under_60_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1_0000000, &0, &token_addr, &None, &None); +} + +#[test] +fn test_subscribe_interval_minimum_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + client.set_min_interval(&60u64); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &3600, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.interval, 3600); +} + +#[test] +#[should_panic(expected = "Error(Contract, #15)")] +fn test_subscribe_amount_above_cap_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &(MAX_SUBSCRIPTION_AMOUNT + 1)); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &(MAX_SUBSCRIPTION_AMOUNT + 1), &200); + + client.subscribe( + &user, + &merchant, + &(MAX_SUBSCRIPTION_AMOUNT + 1), + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_amount_at_cap_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &MAX_SUBSCRIPTION_AMOUNT); + let token = soroban_sdk::token::Client::new(&env, &token_addr); + token.approve(&user, &contract_id, &MAX_SUBSCRIPTION_AMOUNT, &200); + + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user, + &merchant, + &MAX_SUBSCRIPTION_AMOUNT, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.amount, MAX_SUBSCRIPTION_AMOUNT); +} + +// ───────────────────────────────────────────── +// Admin transfer tests +// ───────────────────────────────────────────── + +#[test] +fn test_transfer_admin() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + // Step 1: propose + client.transfer_admin(&new_admin); + // Step 2: accept + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_transfer_admin_event_emitted() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_old_admin, emitted_new_admin): (Address, Address) = + data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "admin_transferred")); + assert_eq!(emitted_old_admin, old_admin); + assert_eq!(emitted_new_admin, new_admin); +} + +#[test] +fn test_transfer_admin_requires_auth() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_eq!(current_admin, new_admin); +} + +#[test] +fn test_old_admin_loses_access_after_transfer() { + let (env, contract_id, _token_addr, old_admin, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &old_admin); + }); + + let new_admin = Address::generate(&env); + client.transfer_admin(&new_admin); + client.accept_admin(); + + let current_admin = env.as_contract(&contract_id, || storage::get_admin(&env)); + assert_ne!(current_admin, old_admin); +} + +#[test] +#[should_panic] +fn test_accept_admin_without_proposal_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.accept_admin(); +} + +#[test] +fn test_initialize_without_valid_token() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + + // Using a user address instead of a token contract address. + // The contract currently does not validate if the address is a valid token contract + // or even if it's a contract at all. + let invalid_token = Address::generate(&env); + let admin = Address::generate(&env); + + client.initialize(&invalid_token, &admin); + + // Success means it didn't panic, which is the current expected behavior. +} + +// ───────────────────────────────────────────── +// Global volume cap tests +// ───────────────────────────────────────────── + +/// Helper: set up a user with a large balance for global volume testing +fn setup_large_balance(env: &Env, contract_id: &Address, token_addr: &Address) -> Address { + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &100_000_000_000_000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &100_000_000_000_000, &200000); + user +} + +#[test] +fn test_global_volume_within_limit() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; // well under limit + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + // Should succeed - well under the 50 trillion stroops limit +} + +#[test] +#[should_panic] +fn test_global_volume_exceeds_limit() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Give users large balances to exceed the 50_000_000_000_000 limit + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 30_000_000_000_000; // 30 trillion stroops each + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // First charge succeeds (30 trillion used) + client.charge(&user_a); + + // Second charge should panic (60 trillion total > 50 trillion limit) + client.charge(&user_b); +} + +#[test] +fn test_global_volume_window_reset() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; // well under MAX_AMOUNT + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); // 5 trillion used this window + + // Advance time past the 1-hour window boundary (3601 seconds) + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + + // This charge should succeed because the window has reset + client.charge(&user_b); +} + +// ───────────────────────────────────────────── +// Issue #10: get_global_volume_window tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_global_volume_window_returns_zero_on_fresh_contract() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, 0, "accumulated volume should be 0 on fresh contract"); + assert_eq!(window_start, 0, "window start should be 0 on fresh contract"); +} + +#[test] +fn test_get_global_volume_window_correct_values_after_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + let charge_time = env.ledger().timestamp(); + client.charge(&user); + + let (volume, window_start) = client.get_global_volume_window(); + assert_eq!(volume, amount, "accumulated volume should equal the charged amount"); + assert_eq!(window_start, charge_time, "window_start should equal ledger timestamp at charge time"); +} + +#[test] +fn test_get_global_volume_window_resets_after_hour() { + let (env, contract_id, token_addr, _user_setup, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_a = setup_large_balance(&env, &contract_id, &token_addr); + let user_b = setup_large_balance(&env, &contract_id, &token_addr); + + let amount: i128 = 1_000_0000000; + let interval: u64 = 86400; + + client.subscribe(&user_a, &merchant, &amount, &interval, &token_addr, &None, &None); + client.subscribe(&user_b, &merchant, &amount, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user_a); + + // Confirm volume accumulated in the first window + let (volume_before, _) = client.get_global_volume_window(); + assert_eq!(volume_before, amount); + + // Advance past the 1-hour window boundary + env.ledger().with_mut(|l| { + l.timestamp += 3601; + }); + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + let second_charge_time = env.ledger().timestamp(); + client.charge(&user_b); + + // Window should have reset: only the second charge amount is accumulated + let (volume_after, window_start_after) = client.get_global_volume_window(); + assert_eq!(volume_after, amount, "volume should reset to just the new charge amount after window expiry"); + assert_eq!(window_start_after, second_charge_time, "window_start should be the new charge time after reset"); +} + + + +// ───────────────────────────────────────────── +// subscribe_with_metadata tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscribe_with_metadata_success() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let label = soroban_sdk::String::from_str(&env, "Pro Plan"); + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &label, + ); + + // Verify subscription is created + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + + // Verify metadata is set + assert_eq!(client.get_metadata(&user), Some(label)); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_label_too_long() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Create a 65-byte label (exceeds 64-byte limit) + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", // 65 chars + ); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Should panic with MetadataLabelTooLong + client.subscribe_with_metadata( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + &long_label, + ); +} + +#[test] +#[should_panic] +fn test_subscribe_with_metadata_no_subscription_on_label_failure() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let long_label = soroban_sdk::String::from_str( + &env, + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", + ); + + // Label validation happens before subscribe_inner, so no subscription should be written. + // This panics before any storage write — we verify that by catching the panic separately + // in test_subscribe_with_metadata_label_too_long. Here we just assert the panic occurs. + client.subscribe_with_metadata( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + &long_label, + ); +} + +// ───────────────────────────────────────────── +// get_protocol_stats tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_protocol_stats_initial() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let stats = client.get_protocol_stats(); + + assert_eq!(stats.active_count, 0); + assert_eq!(stats.fee_bps, 0); + assert!(stats.fee_collector.is_none()); + assert_eq!(stats.grace_period, 0); + assert!(!stats.whitelist_enabled); + assert_eq!(stats.schema_version, 3); // setup uses the current schema + assert!(!stats.contract_paused); +} + +#[test] +fn test_get_protocol_stats_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.active_count, 1); +} + +#[test] +fn test_get_protocol_stats_with_fee() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + let fee_collector = Address::generate(&env); + client.propose_fee(&fee_collector, &100); // 1% fee + client.commit_fee(); + + let stats = client.get_protocol_stats(); + assert_eq!(stats.fee_bps, 100); + assert_eq!(stats.fee_collector, Some(fee_collector)); +} + +#[test] +fn test_get_protocol_stats_contract_paused() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Set admin directly in instance storage so admin-gated functions work + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::Admin, &admin); + }); + + env.mock_all_auths(); + client.pause_contract(); + + let stats = client.get_protocol_stats(); + assert!(stats.contract_paused); + + client.unpause_contract(); + let stats_after = client.get_protocol_stats(); + assert!(!stats_after.contract_paused); +} + +#[test] +fn test_resubscribe() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + // Initial subscription + client.subscribe( + &user, + &merchant_a, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sub1 = client.get_subscription(&user).unwrap(); + assert_eq!(sub1.merchant, merchant_a); + assert_eq!(sub1.amount, 1_0000000); + + // Subscribe again with different parameters + client.subscribe( + &user, + &merchant_b, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + let sub2 = client.get_subscription(&user).unwrap(); + + assert_eq!(sub2.merchant, merchant_b); + assert_eq!(sub2.amount, 2_0000000); + assert_eq!(sub2.interval, 172800); + + // Verify old merchant is gone + assert_ne!(sub2.merchant, merchant_a); +} + +#[test] +fn test_subscribe_overwrites_cancelled_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. Cancel + client.cancel(&user); + let sub_cancelled = client.get_subscription(&user).unwrap(); + assert!(!sub_cancelled.active); + + // 3. Subscribe again + client.subscribe( + &user, + &merchant, + &2_0000000, + &172800, + &token_addr, + &None, + &None, + ); + + // 4. Verify new subscription is active + let sub_new = client.get_subscription(&user).unwrap(); + assert!(sub_new.active); + assert_eq!(sub_new.amount, 2_0000000); +} + +// ───────────────────────────────────────────── +// min_interval tests +// ───────────────────────────────────────────── + +/// get_min_interval returns 3600 (1 hour) before any admin configuration. +#[test] +fn test_get_min_interval_default() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_min_interval(), 3600); +} + +#[test] +fn test_min_interval_event_emitted_on_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Verify default value is 3600 before setting + assert_eq!(client.get_min_interval(), 3600); + + // First set: old value should be 3600 default, new value 7200 + client.set_min_interval(&7200u64); + assert_eq!(client.get_min_interval(), 7200); + + let events_vec = env.events().all(); + let (_, topics, data) = events_vec.get(events_vec.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "min_interval_set")); + + let event_data: events::MinIntervalSetEventData = data.try_into_val(&env).unwrap(); + assert_eq!(event_data.old, 3600); + assert_eq!(event_data.new, 7200); + + // Second set: old value 7200, new value 86400 + client.set_min_interval(&86400u64); + assert_eq!(client.get_min_interval(), 86400); + + let events_vec2 = env.events().all(); + let (_, topics2, data2) = events_vec2.get(events_vec2.len() - 1).unwrap(); + let topic_symbol2: Symbol = topics2.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol2, Symbol::new(&env, "min_interval_set")); + + let event_data2: events::MinIntervalSetEventData = data2.try_into_val(&env).unwrap(); + assert_eq!(event_data2.old, 7200); + assert_eq!(event_data2.new, 86400); + + // Same value set again: old == 86400, new == 86400 + client.set_min_interval(&86400u64); + let events_vec3 = env.events().all(); + let (_, topics3, data3) = events_vec3.get(events_vec3.len() - 1).unwrap(); + let topic_symbol3: Symbol = topics3.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol3, Symbol::new(&env, "min_interval_set")); + + let event_data3: events::MinIntervalSetEventData = data3.try_into_val(&env).unwrap(); + assert_eq!(event_data3.old, 86400); + assert_eq!(event_data3.new, 86400); +} + +#[test] +fn test_top_merchants_by_subs() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Create subscriptions for m1 (1 sub), m2 (3 subs), m3 (2 subs) + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + let u3 = setup_funded_user(&env, &contract_id, &token_addr); + let u4 = setup_funded_user(&env, &contract_id, &token_addr); + let u5 = setup_funded_user(&env, &contract_id, &token_addr); + let u6 = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u3, &m2, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u4, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + client.subscribe(&u5, &m3, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u6, &m3, &1_0000000, &86400, &token_addr, &None, &None); + + // Top 3 merchants: m2 (3 subs), m3 (2 subs), m1 (1 sub) + let top = client.get_top_merchants_by_subs(&3u32); + assert_eq!(top.len(), 3); + assert_eq!(top.get(0).unwrap(), (m2.clone(), 3u32)); + assert_eq!(top.get(1).unwrap(), (m3.clone(), 2u32)); + assert_eq!(top.get(2).unwrap(), (m1.clone(), 1u32)); + + // Unknown / unindexed merchant returns 0 for subscriber count query + let unindexed = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unindexed), 0); +} + +#[test] +fn test_top_merchants_tie_breaking_and_limit() { + let (env, contract_id, token_addr, _user, _m) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + + // Add m1 first, then m2 + client.add_merchant(&m1); + client.add_merchant(&m2); + + let u1 = setup_funded_user(&env, &contract_id, &token_addr); + let u2 = setup_funded_user(&env, &contract_id, &token_addr); + + // Both m1 and m2 get 1 sub (tie) + client.subscribe(&u1, &m1, &1_0000000, &86400, &token_addr, &None, &None); + client.subscribe(&u2, &m2, &1_0000000, &86400, &token_addr, &None, &None); + + // Tie-breaking preserves index order: m1 first, m2 second + let top = client.get_top_merchants_by_subs(&2u32); + assert_eq!(top.len(), 2); + assert_eq!(top.get(0).unwrap(), (m1.clone(), 1u32)); + assert_eq!(top.get(1).unwrap(), (m2.clone(), 1u32)); + + // Limit 1 returns top 1 + let top1 = client.get_top_merchants_by_subs(&1u32); + assert_eq!(top1.len(), 1); + assert_eq!(top1.get(0).unwrap(), (m1.clone(), 1u32)); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_top_merchants_limit_exceeded_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.get_top_merchants_by_subs(&21u32); +} + +/// subscribe panics with IntervalTooShort when interval < default floor of 3600. +#[test] +#[should_panic] +fn test_subscribe_interval_too_short_panics_default_floor() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // 1800 seconds (30 min) < 3600 default floor + client.subscribe( + &user, + &merchant, + &1_0000000, + &1800, + &token_addr, + &None, + &None, + ); +} + +/// Lowering the floor via set_min_interval then subscribing at the new floor succeeds. +#[test] +fn test_subscribe_after_set_min_interval_lower_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&60u64); + + assert_eq!(client.get_min_interval(), 60); + // 60 seconds == new floor — should succeed + client.subscribe(&user, &merchant, &1_0000000, &60, &token_addr, &None, &None); + assert!(client.get_subscription(&user).unwrap().active); +} + +#[test] +fn prop_subscribe_interval_respects_min_interval_floor() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let default_floor = client.get_min_interval(); + + let mut state = 0x9e3779b97f4a7c15u64; + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % default_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "interval {interval} must be rejected"); + } + + for offset in 0..4 { + let interval = default_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } + + let admin = Address::generate(&env); + client.set_initial_admin(&admin); + let updated_floor = 97u64; + client.set_min_interval(&updated_floor); + assert_eq!(client.get_min_interval(), updated_floor); + + for sample in 0..4 { + state ^= state << 7; + state ^= state >> 9; + let interval = if sample == 0 { + 0 + } else { + state % updated_floor + }; + let user = setup_funded_user(&env, &contract_id, &token_addr); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + })); + assert!(result.is_err(), "updated floor rejected interval {interval}"); + } + + for offset in 0..4 { + let interval = updated_floor + offset; + let user = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscription(&user).unwrap().interval, interval); + } +} + +/// set_min_interval(0) panics. +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_set_min_interval_zero_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + client.set_min_interval(&0u64); +} + +/// Calling set_min_interval without a configured admin panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_set_min_interval_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics with "admin not set" + client.set_min_interval(&7200u64); +} + +// ───────────────────────────────────────────── +// clear_merchant_revenue_history tests +// ───────────────────────────────────────────── + +/// Admin can clear history; subsequent query returns an empty Vec (zero-length). +/// Clearing does not affect the cumulative revenue total. +#[test] +fn test_clear_merchant_revenue_history_drops_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.set_initial_admin(&admin); + + // Produce some history via a charge + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // History should have one entry + let history_before = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_before.len(), 1); + + // Cumulative revenue is present + let revenue = client.get_merchant_revenue(&merchant); + assert!(revenue > 0); + + // Clear history as admin + client.clear_merchant_revenue_history(&merchant); + + // History is now zero-length + let history_after = client.get_merchant_revenue_history(&merchant, &10u32); + assert_eq!(history_after.len(), 0); + + // Cumulative revenue is untouched + assert_eq!(client.get_merchant_revenue(&merchant), revenue); +} + +/// Clearing history for a merchant with no recorded data is idempotent (does not panic). +#[test] +fn test_clear_merchant_revenue_history_idempotent() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let unknown_merchant = Address::generate(&env); + + client.set_initial_admin(&admin); + + // First call — no data exists, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + // Second call — still no data, must not panic + client.clear_merchant_revenue_history(&unknown_merchant); + + assert_eq!( + client + .get_merchant_revenue_history(&unknown_merchant, &5u32) + .len(), + 0 + ); +} + +/// Calling clear_merchant_revenue_history without an admin configured panics. +#[test] +#[should_panic(expected = "admin not set")] +fn test_clear_merchant_revenue_history_non_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + // No admin configured — require_admin panics + client.clear_merchant_revenue_history(&merchant); +} + +// ───────────────────────────────────────────── +// Subscriber index tests +// ───────────────────────────────────────────── + +#[test] +fn test_subscriber_index_three_unique_users() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 3); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 3); + assert_eq!(page.get(0).unwrap(), user_a); + assert_eq!(page.get(1).unwrap(), user_b); + assert_eq!(page.get(2).unwrap(), user_c); +} + +#[test] +fn test_get_subscriber_at_returns_first() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_at(&0u64), Some(user)); + assert_eq!(client.get_subscriber_at(&1u64), None); +} + +#[test] +fn test_resubscribe_active_does_not_duplicate_index() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + // Re-subscribe while still active — must not append a second entry + client.subscribe( + &user, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); +} + +#[test] +fn test_subscriber_page_offset_beyond_count_returns_empty() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_count(), 1); + + let page = client.get_subscriber_page(&1u64, &10u32); + assert_eq!(page.len(), 0); + + let page_zero_limit = client.get_subscriber_page(&0u64, &0u32); + assert_eq!(page_zero_limit.len(), 0); +} + +#[test] +#[cfg(feature = "bench")] +fn test_subscriber_page_limit_capped_at_50() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let sac = StellarAssetClient::new(&env, &token_addr); + let token = TokenClient::new(&env, &token_addr); + + for _ in 0..52 { + let sub_user = Address::generate(&env); + sac.mint(&sub_user, &10_000_0000000); + token.approve(&sub_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &sub_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + } + + assert_eq!(client.get_subscriber_count(), 53); + + let page = client.get_subscriber_page(&0u64, &100u32); + assert_eq!(page.len(), 50); +} +// Issue #231: token.rs SAC compatibility test +// ───────────────────────────────────────────── + +/// Test that a custom SAC token (not native XLM) works end-to-end +/// with subscribe, charge, and pay_per_use operations. +#[test] +fn test_custom_sac_token_end_to_end_flow() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Setup a custom SAC token (not the default one from setup()) + let custom_token = setup_second_token(&env, &contract_id, &user); + let token = TokenClient::new(&env, &custom_token); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Step 1: Subscribe with custom SAC token + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &custom_token, + &None, + &None, + ); + + // Verify subscription uses the custom token + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active); + assert_eq!(sub.amount, amount); + assert_eq!( + sub.token, custom_token, + "subscription should use custom SAC token" + ); + + // Step 2: Charge after interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let user_balance_before = token.balance(&user); + let merchant_balance_before = token.balance(&merchant); + + client.charge(&user); + + let user_balance_after = token.balance(&user); + let merchant_balance_after = token.balance(&merchant); + + // Verify exact amount transferred + assert_eq!( + user_balance_before - user_balance_after, + amount, + "user balance should decrease by subscription amount" + ); + assert_eq!( + merchant_balance_after - merchant_balance_before, + amount, + "merchant balance should increase by subscription amount" + ); + + // Step 3: Pay-per-use with custom SAC token + let user_balance_before_ppu = token.balance(&user); + let merchant_balance_before_ppu = token.balance(&merchant); + + let ppu_amount: i128 = 2_0000000; + client.pay_per_use(&user, &ppu_amount); + + let user_balance_after_ppu = token.balance(&user); + let merchant_balance_after_ppu = token.balance(&merchant); + + // Verify pay-per-use amount transferred + assert_eq!( + user_balance_before_ppu - user_balance_after_ppu, + ppu_amount, + "user balance should decrease by pay_per_use amount" + ); + assert_eq!( + merchant_balance_after_ppu - merchant_balance_before_ppu, + ppu_amount, + "merchant balance should increase by pay_per_use amount" + ); + + // Verify subscription is still active after pay_per_use + let sub_final = client.get_subscription(&user).unwrap(); + assert!( + sub_final.active, + "subscription should remain active after pay_per_use" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #237: get_token() read function tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_token_returns_none_when_not_initialized() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let client = FlowPayClient::new(&env, &contract_id); + assert!(client.get_token().is_none()); +} + +#[test] +fn test_get_token_returns_initialized_token() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + client.initialize(&token_addr, &admin); + assert_eq!(client.get_token(), Some(token_addr)); +} + +// ───────────────────────────────────────────── +// Issue: get_grace_period getter +// ───────────────────────────────────────────── + +#[test] +fn test_get_grace_period_default_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + assert_eq!(client.get_grace_period(), 0); +} + +#[test] +fn test_get_grace_period_after_set() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + client.propose_grace_period(&3600); + client.commit_grace_period(); + assert_eq!(client.get_grace_period(), 3600); +} + +// ───────────────────────────────────────────── +// Issue: fee_updated event on set_fee +// ───────────────────────────────────────────── + +#[test] +fn test_set_fee_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let (emitted_collector, emitted_bps): (Address, u32) = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); + assert_eq!(emitted_collector, collector); + assert_eq!(emitted_bps, 100u32); +} + +#[test] +fn test_get_fee_returns_current_fee_settings() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &250); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 250u32))); +} + +#[test] +#[should_panic] +fn test_set_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &10001); + client.commit_fee(); +} + +// ───────────────────────────────────────────── +// Issue: grace_period_updated event on set_grace_period +// ───────────────────────────────────────────── + +#[test] +fn test_set_grace_period_emits_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_grace_period(&7200); + client.commit_grace_period(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let emitted_seconds: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!(topic_symbol, Symbol::new(&env, "grace_period_committed")); + assert_eq!(emitted_seconds, 7200u64); +} + +// ───────────────────────────────────────────── +// Issue #195: grace period charge behavior +// ───────────────────────────────────────────── + +#[test] +fn test_charge_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Past billing interval but still inside grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.last_charged, env.ledger().timestamp()); +} + +#[test] +#[should_panic(expected = "Error(Contract, #9)")] +fn test_charge_after_grace_window_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_non_admin_set_grace_period_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.propose_grace_period(&3600); + client.commit_grace_period(); +} + +// ───────────────────────────────────────────── + +// ------------------------------------------------------------- +// Issue #45: resume/cancel on grace-lapsed subscriptions +// ------------------------------------------------------------- + + +/// resume on a grace-lapsed subscription must panic with ResumeGraceLapsed (#100). +#[test] +#[should_panic(expected = "Error(Contract, #43)")] +fn test_resume_after_grace_lapse_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // resume must be rejected because the grace window has closed + client.resume(&user); +} + +/// cancel on a grace-lapsed subscription must still succeed. +#[test] +fn test_cancel_after_grace_lapse_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval + grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period + 1; + }); + + // cancel must still be allowed so the user can exit cleanly + client.cancel(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.active, "subscription should be inactive after cancel"); +} + +/// resume within a valid (non-lapsed) grace window must succeed normally. +#[test] +fn test_resume_within_grace_window_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let grace_period: u64 = 86400; + let interval: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance past interval but still inside the grace window + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period / 2; + }); + + // resume must succeed because the grace window has not yet closed + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); + assert!(sub.active, "subscription should remain active"); +} + +/// resume when no grace period is configured must succeed regardless of elapsed time. +#[test] +fn test_resume_no_grace_period_always_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No grace period set -- default is 0 + let interval: u64 = 86400; + client.subscribe(&user, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.pause(&user); + + // Advance far past the interval -- grace is 0 so lapse check is skipped + env.ledger().with_mut(|l| { + l.timestamp += interval * 10; + }); + + // resume must succeed because grace_period == 0 means no lapse + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(!sub.paused, "subscription should not be paused after resume"); +} + +// Issue #243: Token address validation +// ───────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #12)")] +fn test_subscribe_non_contract_address() { + let (env, contract_id, _token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // Provide a non-contract address (just an account) + use soroban_sdk::xdr::{AccountId, PublicKey, ScAddress, Uint256}; + use soroban_sdk::TryFromVal; + let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0; 32]))); + let non_contract_token = Address::try_from_val(&env, &ScAddress::Account(account_id)).unwrap(); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &non_contract_token, + &None, + &None, + ); +} + +#[test] +fn test_subscribe_valid_sac_token_address_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.token, token_addr); +} + +// Issue #232: charge() insufficient-allowance error path +// ───────────────────────────────────────────── + +/// If a user's token allowance drops below `sub.amount` between subscribe and +/// charge time, `transfer_from` must fail and propagate the error. +#[test] +#[should_panic] +fn test_charge_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + // Subscribe with sufficient allowance + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Revoke allowance — set it to 0 + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &200); + + // Advance ledger past the interval + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + // charge() should panic because transfer_from fails with insufficient allowance + client.charge(&user); +} + +#[test] +fn test_set_metadata_label_at_limit_succeeds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let valid_label = soroban_sdk::String::from_str( + &env, + "this_is_a_perfectly_valid_sixty_four_character_metadata_label_ok", + ); + assert_eq!(valid_label.len(), 64); + + client.set_metadata(&user, &valid_label); + + assert_eq!(client.get_metadata(&user), Some(valid_label)); +} + +#[test] +#[should_panic] +fn test_set_metadata_label_exceeding_limit_fails() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let invalid_label = soroban_sdk::String::from_str( + &env, + "this_is_an_invalid_sixty_five_character_metadata_label_too_long_!", + ); + assert_eq!(invalid_label.len(), 65); + + client.set_metadata(&user, &invalid_label); +} +// ───────────────────────────────────────────── +// Issue #469: set_subscription_label auth and alias tests +// ───────────────────────────────────────────── +#[test] +fn test_set_metadata_wrong_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let attacker = Address::generate(&env); + let label = soroban_sdk::String::from_str(&env, "hacked"); + client.set_metadata(&attacker, &label); +} + +#[test] +fn test_get_subscription_label_returns_set_value() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + let label = soroban_sdk::String::from_str(&env, "premium"); + client.set_metadata(&user, &label); + assert_eq!(client.get_subscription_label(&user), Some(label)); +} + +#[test] +fn test_get_subscription_label_none_when_not_set() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let random = Address::generate(&env); + assert!(client.get_subscription_label(&random).is_none()); +} + +// ───────────────────────────────────────────── +// Tests for pause() and resume() +// ───────────────────────────────────────────── + +#[test] +fn test_pause_sets_paused_true() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.paused); +} + +#[test] +#[should_panic] +fn test_charge_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); +} + +#[test] +#[should_panic] +fn test_pay_per_use_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + client.pay_per_use(&user, &1_0000000); +} + +#[test] +fn test_resume_unpauses_and_charge_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + client.resume(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.last_charged > 0); +} + +#[test] +#[should_panic] +fn test_pause_on_inactive_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + client.pause(&user); +} + +// ───────────────────────────────────────────── +// Tests for next_charge_at() +// ───────────────────────────────────────────── + +#[test] +fn test_next_charge_at_returns_correct_timestamp() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + let sub = client.get_subscription(&user).unwrap(); + let expected = sub.last_charged + sub.interval; + let got = client.next_charge_at(&user).unwrap(); + assert_eq!(got, expected); +} + +#[test] +fn test_next_charge_at_none_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_next_charge_at_none_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!(client.next_charge_at(&random).is_none()); +} + +#[test] +fn test_transfer_subscription_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + assert!( + client.get_subscription(&user).is_none(), + "old subscription should be removed" + ); + + let new_sub = client.get_subscription(&new_user).unwrap(); + assert!(new_sub.active, "new subscription should be active"); + assert_eq!(new_sub.merchant, merchant); + assert_eq!(new_sub.amount, 1_0000000); + assert_eq!(client.get_subscriber_count(), 2); + assert_eq!(client.get_subscriber_at(&0u64), None); + assert_eq!(client.get_subscriber_at(&1u64), Some(new_user)); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_transfer_subscription_to_inactive_user_reuses_tombstone_membership() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let new_user = setup_funded_user(&env, &contract_id, &token_addr); + let inactive_merchant = Address::generate(&env); + + client.subscribe( + &new_user, + &inactive_merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&new_user); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); + + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + assert_eq!(client.get_merchant_sub_count(&inactive_merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 1); + assert_eq!(page.get(0).unwrap(), new_user); +} + +#[test] +fn test_transfer_subscription_event_emitted() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.transfer_subscription(&user, &new_user); + + let mut seen_transfer_event = false; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + if topic_symbol == Symbol::new(&env, "subscription_transferred") { + let topic_from: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let topic_to: Address = topics.get(2).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_from, user); + assert_eq!(topic_to, new_user); + + let event_payload: (Address, i128, u64, Address) = data.try_into_val(&env).unwrap(); + assert_eq!(event_payload.0, merchant); + assert_eq!(event_payload.1, 1_0000000); + assert_eq!(event_payload.2, 86400); + assert_eq!(event_payload.3, token_addr); + seen_transfer_event = true; + } + } + + assert!( + seen_transfer_event, + "expected a subscription_transferred event" + ); +} + +#[test] +#[should_panic] +fn test_transfer_subscription_to_active_user_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let new_user = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&new_user, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&new_user, &contract_id, &10_000_0000000, &200); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &new_user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &new_user); +} +// ───────────────────────────────────────────── +// CONTRACT-08: Allowance pre-validation tests +// ───────────────────────────────────────────── + +/// subscribe() with zero allowance must panic with InsufficientAllowance +/// and must NOT write the subscription to storage. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_subscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + env.storage().instance().set(&DataKey::SchemaVersion, &3u32); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Deliberately grant zero allowance — no approve() call. + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +/// After a zero-allowance subscribe() panic, get_subscription() must return None, +/// confirming no storage was written. +/// Note: In the Soroban test environment, panics abort the entire transaction, +/// so storage changes from the failed call are never committed. We verify this +/// by reading storage directly inside the contract after a successful (non-panicking) +/// path: a user who was never subscribed must always return None. +#[test] +fn test_subscribe_zero_allowance_does_not_write_storage() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + let user = Address::generate(&env); + + // Never approved any allowance — a subscribe call would panic. + // Soroban transactions are atomic: a panic reverts all storage writes. + // We confirm the storage slot starts empty (None) and — since we cannot + // call subscribe without panicking — we verify the invariant holds: a + // user address that has never successfully subscribed always returns None. + let client = FlowPayClient::new(&env, &contract_id); + assert!( + client.get_subscription(&user).is_none(), + "subscription must not be stored for a user who has never successfully subscribed" + ); +} + +/// subscribe() with allowance exactly equal to amount must succeed. +#[test] +fn test_subscribe_exact_allowance_succeeds() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::SchemaVersion, &3u32); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 5_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // Approve exactly amount — no more, no less. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &amount, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + + let sub = client.get_subscription(&user).unwrap(); + assert!(sub.active, "subscription should be active"); + assert_eq!(sub.amount, amount); +} + +/// Re-subscribe (overwriting a cancelled subscription) with zero allowance +/// must also panic with InsufficientAllowance. +#[test] +#[should_panic(expected = "Error(Contract, #8)")] +fn test_resubscribe_zero_allowance_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); + let token_addr = token_id.address(); + + let contract_id = env.register_contract(None, FlowPay); + env.as_contract(&contract_id, || { + env.storage().instance().set(&DataKey::SchemaVersion, &3u32); + }); + + let user = Address::generate(&env); + let merchant = Address::generate(&env); + + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user, &10_000_0000000); + + let amount: i128 = 1_0000000; + + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, false); + }); + + // First subscribe with sufficient allowance. + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &10_000_0000000, &200); + + let client = FlowPayClient::new(&env, &contract_id); + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.cancel(&user); + + // Revoke allowance so second subscribe sees zero. + token.approve(&user, &contract_id, &0, &200); + + // Re-subscribe must panic because allowance is zero. + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); +} + +// ───────────────────────────────────────────── +// CONTRACT-36: set_subscription_amount tests +// ───────────────────────────────────────────── + +/// Admin successfully updates a subscription amount; get_subscription reflects +/// the new value and last_charged / interval are untouched. +#[test] +fn test_set_subscription_amount_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let original_amount: i128 = 1_0000000; + let new_amount: i128 = 3_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &original_amount, + &interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.amount, original_amount); + let last_charged_before = sub_before.last_charged; + + client.set_subscription_amount(&user, &new_amount); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!(sub_after.amount, new_amount, "amount should be updated"); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.interval, interval, "interval must not change"); + assert!(sub_after.active, "subscription should remain active"); +} + +/// Updating a non-existent subscription must panic with NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_amount_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_amount(&random, &2_0000000); +} + +/// A non-admin caller must not be able to update a subscription amount. +#[test] +#[should_panic] +fn test_set_subscription_amount_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Remove all authorizations so the admin auth check fails. + env.set_auths(&[]); + + client.set_subscription_amount(&user, &2_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-37: set_subscription_interval tests +// ───────────────────────────────────────────── + +/// Admin successfully updates the billing interval; next_charge_at reflects the +/// new value and last_charged / amount are untouched. +#[test] +fn test_set_subscription_interval_admin_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let amount: i128 = 1_0000000; + let original_interval: u64 = 86400; // 1 day + let new_interval: u64 = 30 * 24 * 3600; // 30 days + + client.subscribe( + &user, + &merchant, + &amount, + &original_interval, + &token_addr, + &None, + &None, + ); + + let sub_before = client.get_subscription(&user).unwrap(); + assert_eq!(sub_before.interval, original_interval); + let last_charged_before = sub_before.last_charged; + let amount_before = sub_before.amount; + + client.set_subscription_interval(&user, &new_interval); + + let sub_after = client.get_subscription(&user).unwrap(); + assert_eq!( + sub_after.interval, new_interval, + "interval should be updated" + ); + assert_eq!( + sub_after.last_charged, last_charged_before, + "last_charged must not change" + ); + assert_eq!(sub_after.amount, amount_before, "amount must not change"); + assert!(sub_after.active, "subscription should remain active"); + + // next_charge_at must reflect last_charged + new_interval + let expected_next = last_charged_before + new_interval; + assert_eq!( + client.next_charge_at(&user).unwrap(), + expected_next, + "next_charge_at should use the updated interval" + ); +} + +/// Setting an interval of zero must panic with IntervalMustBePositive. +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_set_subscription_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_interval(&user, &0); +} + +/// Updating the interval for a non-existent subscription must panic with +/// NoSubscriptionFound. +#[test] +#[should_panic(expected = "Error(Contract, #4)")] +fn test_set_subscription_interval_no_subscription_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let random = Address::generate(&env); + client.set_subscription_interval(&random, &86400); +} + +/// A non-admin caller must not be able to update the billing interval. +#[test] +#[should_panic] +fn test_set_subscription_interval_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + env.set_auths(&[]); + + client.set_subscription_interval(&user, &172800); +} + +// ───────────────────────────────────────────── +// CONTRACT-38: withdraw_merchant_revenue tests +// ───────────────────────────────────────────── + +/// Merchant with accrued revenue can withdraw the full tracked balance. +/// After withdrawal: token balance increases by the tracked amount and the +/// revenue counter resets to zero. +#[test] +fn test_withdraw_merchant_revenue_succeeds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let sac = StellarAssetClient::new(&env, &token_addr); + + // Initialize the global token so withdraw can resolve it. + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + client.charge(&user); + + // The tracked revenue equals the net charge (no fee configured in setup). + let tracked = client.get_merchant_revenue(&merchant); + assert!(tracked > 0, "revenue should be positive after charge"); + + // Seed the contract with enough tokens to cover the withdrawal. + // In a pooling model the contract would accumulate these from charges + // routed through it; here we simulate that by minting directly. + sac.mint(&contract_id, &tracked); + + let merchant_balance_before = token.balance(&merchant); + + client.withdraw_merchant_revenue(&merchant); + + // Revenue counter must be reset to zero. + assert_eq!( + client.get_merchant_revenue(&merchant), + 0, + "revenue counter must be reset after withdrawal" + ); + + // Merchant token balance must increase by the tracked amount. + let merchant_balance_after = token.balance(&merchant); + assert_eq!( + merchant_balance_after - merchant_balance_before, + tracked, + "merchant token balance should increase by the withdrawn amount" + ); +} + +/// Withdrawal with no accrued balance must panic with ZeroBalanceAvailable. +#[test] +#[should_panic(expected = "Error(Contract, #21)")] +fn test_withdraw_merchant_revenue_zero_balance_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.initialize(&token_addr, &admin); + + // No charges have occurred, so revenue is zero. + client.withdraw_merchant_revenue(&merchant); +} + +#[test] +fn test_next_charge_at_none_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + assert!(client.next_charge_at(&user).is_none()); +} + +#[test] +fn test_is_charge_due_transitions_after_interval() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Before interval elapses: not due + assert!(!client.is_charge_due(&user)); + + env.ledger().with_mut(|l| { + l.timestamp += interval; + }); + assert!(client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_paused_subscription() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + assert!(!client.is_charge_due(&user)); +} + +// ───────────────────────────────────────────── +// ───────────────────────────────────────────── +// CONTRACT-53: batch_pause_subscriptions tests +// ───────────────────────────────────────────── + +/// Admin can pause multiple valid subscriptions in a single batch call. +/// The test verifies paused flag is set, events are emitted, and already-paused +/// or missing addresses are handled without disruption. +#[test] +fn test_batch_pause_subscriptions_mixed_inputs() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Set up user_b with a subscription + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + // Set up user_c with a subscription (will be paused first) + let user_c = Address::generate(&env); + sac.mint(&user_c, &10_000_0000000); + token.approve(&user_c, &contract_id, &10_000_0000000, &200); + + // Set up user_d with a subscription (valid, will be paused in batch) + let user_d = Address::generate(&env); + sac.mint(&user_d, &10_000_0000000); + token.approve(&user_d, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_c, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_d, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + + // Pre-pause user_c + client.pause(&user_c); + let sub_c_before = client.get_subscription(&user_c).unwrap(); + assert!(sub_c_before.paused); + + // Verify all others start unpaused + assert!(!client.get_subscription(&user_a).unwrap().paused); + assert!(!client.get_subscription(&user_b).unwrap().paused); + assert!(!client.get_subscription(&user_d).unwrap().paused); + + // Build batch with mixed inputs: valid, missing, already-paused, valid + let no_sub_user = Address::generate(&env); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); // valid → should be paused + users.push_back(no_sub_user.clone()); // no subscription → skipped + users.push_back(user_c.clone()); // already paused → no-op + users.push_back(user_b.clone()); // valid → should be paused + users.push_back(user_d.clone()); // valid → should be paused + + let events_before = env.events().all().len(); + + client.batch_pause_subscriptions(&users); + + // All valid subscriptions must be paused + let sub_a = client.get_subscription(&user_a).unwrap(); + assert!(sub_a.paused, "user_a should be paused"); + + let sub_b = client.get_subscription(&user_b).unwrap(); + assert!(sub_b.paused, "user_b should be paused"); + + let sub_d = client.get_subscription(&user_d).unwrap(); + assert!(sub_d.paused, "user_d should be paused"); + + // Already-paused user_c remains paused + let sub_c = client.get_subscription(&user_c).unwrap(); + assert!(sub_c.paused, "user_c should remain paused"); + + // No subscription was created for no_sub_user + assert!( + client.get_subscription(&no_sub_user).is_none(), + "no_sub_user should have no subscription" + ); + + // Verify events: three subscription_paused events (user_a, user_b, user_d) + let events_after = env.events().all(); + let paused_event_count = (events_before..events_after.len()) + .filter(|&i| { + let (_, topics, _) = events_after.get(i).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + topic_symbol == Symbol::new(&env, "subscription_paused") + }) + .count(); + assert_eq!( + paused_event_count, 3, + "should emit 3 subscription_paused events" + ); +} + +/// Non-admin callers must be rejected with an auth panic. +#[test] +#[should_panic] +fn test_batch_pause_subscriptions_non_admin_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Clear all auths — admin auth should fail and panic + env.set_auths(&[]); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + client.batch_pause_subscriptions(&users); +} + +/// Batch size exceeding 25 must panic with BatchTooLarge. +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_pause_subscriptions_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + // Build a vector with 26 entries + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_pause_subscriptions(&users); +} + +#[test] +fn test_admin_batch_cancel_subscriptions_cancels_multiple_accounts() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &2_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 2); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); +} + +#[test] +fn test_batch_cancel_matches_single_cancel_side_effects() { + let (env, contract_id, token_addr, user_single, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_batch = setup_funded_user(&env, &contract_id, &token_addr); + let referrer = Address::generate(&env); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user_single, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_batch, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer), + ); + + client.cancel(&user_single); + let mut users = Vec::new(&env); + users.push_back(user_batch.clone()); + let results = client.batch_cancel(&users); + + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!( + client.get_subscription(&user_single), + client.get_subscription(&user_batch) + ); + assert_eq!(client.get_referrer(&user_single), None); + assert_eq!(client.get_referrer(&user_batch), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 2); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert_eq!(count_user_events(&env, "cancelled", &user_single), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_batch), 1); +} + +#[test] +#[should_panic] +fn test_batch_cancel_requires_admin_auth() { + let env = Env::default(); + let contract_id = env.register_contract(None, FlowPay); + let admin = Address::generate(&env); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = Vec::new(&env); + users.push_back(user); + + client.batch_cancel(&users); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_cancel_exceeds_max_size_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..26 { + users.push_back(Address::generate(&env)); + } + client.batch_cancel(&users); +} + +#[test] +fn test_batch_cancel_at_max_size_succeeds() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..25 { + users.push_back(Address::generate(&env)); + } + + let results = client.batch_cancel(&users); + assert_eq!(results.len(), 25); + for result in results.iter() { + assert_eq!(result, CancelResult::NoSubscription); + } +} + +#[test] +fn test_batch_cancel_handles_mixed_states_and_clears_referral() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + let user_c = setup_funded_user(&env, &contract_id, &token_addr); + let missing_user = Address::generate(&env); + let referrer = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user_a); + }); + + client.subscribe( + &user_a, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user_b); + client.subscribe( + &user_c, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user_c); + + assert_eq!(client.get_referrer(&user_a), Some(referrer)); + + let mut users = Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + users.push_back(user_c.clone()); + users.push_back(missing_user.clone()); + + let results = client.batch_cancel(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(1).unwrap(), CancelResult::Cancelled); + assert_eq!(results.get(2).unwrap(), CancelResult::AlreadyCancelled); + assert_eq!(results.get(3).unwrap(), CancelResult::NoSubscription); + + assert!(!client.get_subscription(&user_a).unwrap().active); + assert!(!client.get_subscription(&user_b).unwrap().active); + assert!(!client.get_subscription(&user_c).unwrap().active); + assert!(client.get_subscription(&missing_user).is_none()); + + assert_eq!(client.get_referrer(&user_a), None); + assert_eq!(client.get_active_count(), 0); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + assert_eq!(client.get_subscriber_count(), 3); + assert!(client.get_subscriber_at(&0).is_none()); + assert!(client.get_subscriber_at(&1).is_none()); + assert!(client.get_subscriber_at(&2).is_none()); + + assert_eq!(count_user_events(&env, "cancelled", &user_a), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_b), 1); + assert_eq!(count_user_events(&env, "cancelled", &user_c), 1); +} + +// ───────────────────────────────────────────── +// CONTRACT-07: get_merchant_sub_count tests +// ───────────────────────────────────────────── + +#[test] +fn test_merchant_sub_count_two_users_cancel_one() { + let (env, contract_id, token_addr, user_a, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_b = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_b, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_b, &contract_id, &10_000_0000000, &200); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user_a, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.subscribe( + &user_b, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 2); + + client.cancel(&user_a); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); +} + +#[test] +fn test_merchant_sub_count_resubscribe_different_merchant() { + let (env, contract_id, token_addr, user, merchant_a) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchant_b = Address::generate(&env); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + // Subscribe user to merchant A + client.subscribe( + &user, + &merchant_a, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 1); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 0); + + // Re-subscribe user to merchant B + client.subscribe( + &user, + &merchant_b, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant_a), 0); + assert_eq!(client.get_merchant_sub_count(&merchant_b), 1); +} + +#[test] +fn test_merchant_sub_count_never_subscribed_returns_zero() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let unknown_merchant = Address::generate(&env); + assert_eq!(client.get_merchant_sub_count(&unknown_merchant), 0); +} + +#[test] +fn test_merchant_sub_count_double_cancel_no_underflow() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 1_0000000; + let interval: u64 = 86400; + + client.subscribe( + &user, + &merchant, + &amount, + &interval, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_merchant_sub_count(&merchant), 1); + + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); + + // Second cancel must not underflow + client.cancel(&user); + assert_eq!(client.get_merchant_sub_count(&merchant), 0); +} + +#[test] +fn test_is_charge_due_false_past_grace_window() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let interval: u64 = 86400; + let grace: u64 = 3600; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + client.propose_grace_period(&grace); + client.commit_grace_period(); + + env.ledger().with_mut(|l| { + l.timestamp += interval + grace + 1; + }); + + assert!(!client.is_charge_due(&user)); +} + +#[test] +fn test_is_charge_due_false_for_unknown_address() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert!(!client.is_charge_due(&Address::generate(&env))); +} + +#[test] +fn test_daily_limit_day_start_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Spend 10 more + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 20_0000000); + + // Manually extend DailyLimit (and other entries touched by the upcoming pay_per_use) + // TTL so they survive the time skip below. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + // 35,000 ledgers > LEDGERS_PER_DAY (17,280) + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance sequence by LEDGERS_PER_DAY + 1 to expire DayStart (17,280 + 1 = 17,281) + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance, which expired when the ledger sequence jumped past it + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // New spend on new day + client.pay_per_use(&user, &15_0000000); + + // Should only be 15, not 35 + assert_eq!(client.get_daily_spent(&user), 15_0000000); +} + +// ───────────────────────────────────────────── +// CONTRACT-821: simulate_pay_per_use dry-run helper +// ───────────────────────────────────────────── + +/// The sibling dry-run of `pay_per_use` returns distinct outcomes for the +/// inactive, paused, would-succeed, and daily-limit cases, while performing no +/// state writes. +#[test] +fn test_simulate_pay_per_use_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::Inactive + ); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. WouldSucceed when active, no daily limit, allowance sufficient + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + + // 3. DailyLimitExceeded when the limit would be exceeded + client.set_daily_limit(&user, &5_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &6_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 4. DailyLimitExceeded on cumulative spend: 3, then simulate another 3 (>5) + client.pay_per_use(&user, &3_0000000); + assert_eq!( + client.simulate_pay_per_use(&user, &3_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // 5. SubscriptionPaused when paused + let before_spent = client.get_daily_spent(&user); + client.pause(&user); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::SubscriptionPaused + ); + client.resume(&user); + + // 6. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::InsufficientAllowance + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::ContractPaused + ); + + // No simulation wrote to daily spend tracking. + assert_eq!(client.get_daily_spent(&user), before_spent); +} + +/// `simulate_pay_per_use` performs no state writes: daily spent, day start, and +/// balance are unchanged regardless of the simulated outcome. +#[test] +fn test_simulate_pay_per_use_no_state_writes() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &5_0000000); + + client.pay_per_use(&user, &2_0000000); + + let spent_before = client.get_daily_spent(&user); + let day_start_before = client.get_day_start(&user); + let balance_before = TokenClient::new(&env, &token_addr) + .balance(&user); + + // Would succeed + assert_eq!( + client.simulate_pay_per_use(&user, &1_0000000), + PayPerUseSimResult::WouldSucceed + ); + // Limit exceeded + assert_eq!( + client.simulate_pay_per_use(&user, &5_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + assert_eq!(client.get_daily_spent(&user), spent_before); + assert_eq!(client.get_day_start(&user), day_start_before); + assert_eq!( + TokenClient::new(&env, &token_addr).balance(&user), + balance_before + ); +} + +/// Simulating a spend at a day-window boundary reflects the fresh (reset) daily +/// spent value after the window has elapsed, mirroring `pay_per_use`. +#[test] +fn test_simulate_pay_per_use_day_window_reset_boundary() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &100_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + // Spend 10 today. + client.pay_per_use(&user, &10_0000000); + assert_eq!(client.get_daily_spent(&user), 10_0000000); + + // Crossing the day boundary makes the reset daily spent visible to the + // dry-run: today a 45 spend would exceed (10 + 45 > 50)... + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::DailyLimitExceeded + ); + + // Manually extend the DailyLimit (and merchant-revenue) TTL so they survive + // the time skip below, while intentionally leaving DailySpent/DayStart to + // expire so the new window starts from a reset counter. + env.as_contract(&contract_id, || { + let key = DataKey::DailyLimit(user.clone()); + env.storage().temporary().extend_ttl(&key, 35000, 35000); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenue(merchant.clone()), + 35000, + 35000, + ); + env.storage().persistent().extend_ttl( + &DataKey::MerchantRevenueHistory(merchant.clone()), + 35000, + 35000, + ); + }); + + // Advance past the day window (LEDGERS_PER_DAY + 1). + env.ledger().with_mut(|l| { + l.sequence_number += 17281; + l.timestamp += 17281 * 5; + }); + + // Renew the token allowance that expired with the ledger jump. + let token = TokenClient::new(&env, &token_addr); + token.approve( + &user, + &contract_id, + &10_000_0000000, + &(env.ledger().sequence() + 200), + ); + + // The new day's simulated spend is evaluated against a reset counter, + // so the same 45 amount now succeeds. + assert_eq!( + client.simulate_pay_per_use(&user, &45_0000000), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use_to` accounts for recipient validation (invalid +/// contract self-reference and merchant whitelist) in addition to the shared +/// pay-per-use checks. +#[test] +fn test_simulate_pay_per_use_to_recipient_validation() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Contract's own address is an invalid recipient. + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &contract_id), + PayPerUseSimResult::InvalidRecipient + ); + + // With whitelist enabled, a non-whitelisted recipient is rejected. + env.as_contract(&contract_id, || { + whitelist::set_whitelist_enabled(&env, true); + }); + let random = Address::generate(&env); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &random), + PayPerUseSimResult::MerchantNotWhitelisted + ); + + // A valid, whitelisted recipient would succeed. + env.as_contract(&contract_id, || { + whitelist::add_merchant(&env, &merchant); + }); + assert_eq!( + client.simulate_pay_per_use_to(&user, &1_0000000, &merchant), + PayPerUseSimResult::WouldSucceed + ); +} + +/// `simulate_pay_per_use` rejects non-positive and over-cap amounts with the +/// same outcomes the real call enforces. +#[test] +fn test_simulate_pay_per_use_amount_bounds() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No subscription yet, but amount bounds are checked before subscription. + assert_eq!( + client.simulate_pay_per_use(&user, &0), + PayPerUseSimResult::AmountMustBePositive + ); + assert_eq!( + client.simulate_pay_per_use(&user, &(MAX_AMOUNT + 1)), + PayPerUseSimResult::AmountExceedsMaximum + ); +} + +// ───────────────────────────────────────────── +// New Feature Unit Tests (Issues #628, #638, #640, #641) +// ───────────────────────────────────────────── + +#[test] +fn test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let user2 = Address::generate(&env); + let user3_unknown = Address::generate(&env); + + let token = TokenClient::new(&env, &token_addr); + token.approve(&user2, &contract_id, &1_000_000_000, &100); + + client.subscribe( + &user1, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user2, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user1.clone()); + users.push_back(user2.clone()); + users.push_back(user3_unknown.clone()); + + let extended = client.batch_extend_subscription_ttl(&users); + assert_eq!(extended.len(), 2); + assert_eq!(extended.get(0).unwrap(), user1); + assert_eq!(extended.get(1).unwrap(), user2); +} + +#[test] +#[should_panic] +fn test_batch_extend_subscription_ttl_over_limit_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + users.push_back(Address::generate(&env)); + } + + client.batch_extend_subscription_ttl(&users); +} + +#[test] +fn test_simulate_charge_variants() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // 1. Inactive when no subscription + assert_eq!(client.simulate_charge(&user), ChargeSimResult::Inactive); + + // Subscribe + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // 2. NotDue immediately after subscribe + assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); + + // Advance time past interval + env.ledger().with_mut(|l| { + l.timestamp += 86401; + }); + + // 3. WouldSucceed when due and allowed + assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); + + // 4. InsufficientAllowance when allowance revoked + let token = TokenClient::new(&env, &token_addr); + token.approve(&user, &contract_id, &0, &100); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::InsufficientAllowance + ); + + // Restore allowance + token.approve(&user, &contract_id, &1_000_000_000, &100); + + // 5. SubscriptionPaused when paused + client.pause(&user); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::SubscriptionPaused + ); + + // Resume + client.resume(&user); + + // 6. GracePeriodElapsed + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::GracePeriod, &3600u64); + }); + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 3601; + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::GracePeriodElapsed + ); + + // 7. ContractPaused + env.as_contract(&contract_id, || { + storage::set_contract_paused(&env, true); + }); + assert_eq!( + client.simulate_charge(&user), + ChargeSimResult::ContractPaused + ); +} + +#[test] +fn test_get_schema_version_returns_zero_and_updates() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, FlowPay); + let user = Address::generate(&env); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_schema_version(), 0); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let empty_users = soroban_sdk::Vec::new(&env); + client.migrate(&empty_users); + assert_eq!(client.get_schema_version(), 3); +} + +#[test] +#[should_panic] +fn test_pay_per_use_to_contract_address_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.pay_per_use_to(&user, &1_0000000, &contract_id); +} + +#[test] +fn test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let recipient = Address::generate(&env); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let amount: i128 = 4_0000000; + let recipient_before = token.balance(&recipient); + + client.pay_per_use_to(&user, &amount, &recipient); + + assert_eq!(token.balance(&recipient) - recipient_before, amount); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #634: get_merchant_revenue_summary +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_merchant_revenue_summary_empty() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let summary = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary, (0, 0, 0, 0)); +} + +#[test] +fn test_merchant_revenue_summary_single_and_multiple_charges() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let amount: i128 = 10_0000000; + client.subscribe(&user, &merchant, &amount, &86400, &token_addr, &None, &None); + client.pay_per_use(&user, &amount); + + // First charge recorded: 10_0000000 + let summary1 = client.get_merchant_revenue_summary(&merchant); + assert_eq!(summary1, (amount, 1, amount, amount)); + + // Additional pay_per_use calls with different amounts + client.pay_per_use(&user, &5_0000000); + client.pay_per_use(&user, &25_0000000); + + let summary2 = client.get_merchant_revenue_summary(&merchant); + // total = 10 + 5 + 25 = 40_0000000 + // count = 3 + // min = 5_0000000 + // max = 25_0000000 + assert_eq!(summary2, (40_0000000, 3, 5_0000000, 25_0000000)); +} + +#[test] +fn test_merchant_revenue_summary_cleared_history() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pay_per_use(&user, &10_0000000); + client.clear_merchant_revenue_history(&merchant); + + let summary = client.get_merchant_revenue_summary(&merchant); + // History cleared -> total remains 10_0000000, count/min/max return 0 + assert_eq!(summary, (10_0000000, 0, 0, 0)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #635: get_subscription_health +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_subscription_health_non_existent_user() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let unknown = Address::generate(&env); + + let health = client.get_subscription_health(&unknown); + assert_eq!( + health, + SubscriptionHealth { + active: false, + charge_due: false, + within_grace: false, + has_sufficient_allowance: false, + is_paused: false, + trial_active: false, + daily_limit_set: false, + } + ); +} + +#[test] +fn test_subscription_health_active_healthy() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.charge_due, false); + assert_eq!(health.within_grace, false); + assert_eq!(health.has_sufficient_allowance, true); + assert_eq!(health.is_paused, false); + assert_eq!(health.trial_active, false); + assert_eq!(health.daily_limit_set, false); +} + +#[test] +fn test_subscription_health_paused() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.pause(&user); + + let health = client.get_subscription_health(&user); + assert_eq!(health.active, true); + assert_eq!(health.is_paused, true); + assert_eq!(health.charge_due, false); +} + +#[test] +fn test_subscription_health_trial_active() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let trial_sec = 7 * 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &Some(trial_sec), + &None, + ); + + let health = client.get_subscription_health(&user); + assert_eq!(health.trial_active, true); +} + +#[test] +fn test_subscription_health_grace_period() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_grace_period(&86400); + client.commit_grace_period(); + + let interval = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Fast-forward ledger past interval, into grace period window + env.ledger().set(soroban_sdk::testutils::LedgerInfo { + timestamp: env.ledger().timestamp() + interval + 3600, + protocol_version: 20, + sequence_number: 100, + network_id: [0u8; 32], + base_reserve: 10, + min_temp_entry_ttl: 16, + min_persistent_entry_ttl: 16, + max_entry_ttl: 3110400, + }); + + let health = client.get_subscription_health(&user); + assert_eq!(health.charge_due, true); + assert_eq!(health.within_grace, true); +} + +#[test] +fn test_subscription_health_insufficient_allowance() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Revoke allowance + token.approve(&user, &contract_id, &0, &1000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.has_sufficient_allowance, false); +} + +#[test] +fn test_subscription_health_daily_limit_set() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.set_daily_limit(&user, &50_0000000); + + let health = client.get_subscription_health(&user); + assert_eq!(health.daily_limit_set, true); +} + +/// set_initial_admin with proper auth when Admin is unset succeeds and stores admin. +#[test] +fn test_set_initial_admin_success_once() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + assert!(client.get_admin().is_none()); + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin)); +} + +/// A second set_initial_admin call must return typed AdminAlreadySet (code 42), +/// not a raw string panic, and must not change the stored admin. +#[test] +fn test_set_initial_admin_second_call_returns_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin1 = Address::generate(&env); + let admin2 = Address::generate(&env); + + client.set_initial_admin(&admin1); + assert_eq!(client.get_admin(), Some(admin1.clone())); + + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "second set_initial_admin must map to ContractError::AdminAlreadySet" + ); + + // First admin is unchanged — no partial overwrite. + assert_eq!(client.get_admin(), Some(admin1)); +} + +/// Calling set_initial_admin without the proposed admin's auth must fail with an +/// authorization error (host-level, not a contract-level typed error) and must +/// not write the admin slot. +#[test] +fn test_set_initial_admin_unauthenticated_fails() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.set_auths(&[]); + + let result = client.try_set_initial_admin(&admin); + assert!( + result.is_err(), + "set_initial_admin without proposed admin auth must fail" + ); + assert_ne!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "missing auth must be an authorization failure, not AdminAlreadySet" + ); + + assert!( + client.get_admin().is_none(), + "failed set_initial_admin must not persist admin" + ); +} + +/// Partial-init edge case: Token is already stored (e.g. from a separate +/// deploy-step) but Admin slot is still empty. set_initial_admin must still +/// require auth, succeed, and not be confused with initialize's state. +#[test] +fn test_set_initial_admin_token_present_admin_missing() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + // Simulate partial init: write Token but not Admin. + env.as_contract(&contract_id, || { + storage::set_token(&env, &token_addr); + }); + + // Sanity: token stored, admin missing. + assert_eq!(client.get_token(), Some(token_addr.clone())); + assert!(client.get_admin().is_none()); + + // set_initial_admin must still require auth and succeed. + client.set_initial_admin(&admin); + assert_eq!(client.get_admin(), Some(admin.clone())); + // Token state untouched. + assert_eq!(client.get_token(), Some(token_addr)); + + // Subsequent call returns typed error (not a panic) even in partial-init + // post-success state. + let admin2 = Address::generate(&env); + let result = client.try_set_initial_admin(&admin2); + assert_eq!( + result, + Err(Ok(soroban_sdk::Error::from_contract_error( + crate::errors::ContractError::AdminAlreadySet as u32 + ))), + "post-success second call must return AdminAlreadySet in partial-init scenario" + ); + assert_eq!(client.get_admin(), Some(admin)); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #636: validate_interval hardening +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #3)")] +fn test_subscribe_interval_zero_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &10_0000000, &0, &token_addr, &None, &None); +} + +#[test] +#[should_panic(expected = "Error(Contract, #19)")] +fn test_set_subscription_interval_below_min_interval_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &10_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + // Setting interval to 100 seconds when MinInterval is default 3600 panics with #19 (IntervalTooShort) + client.set_subscription_interval(&user, &100); +} + +// ───────────────────────────────────────────────────────────── +// Tests for Issue #637: WhitelistIndex & pagination +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_whitelist_index_size_page_and_swap_remove() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_whitelist_size(), 0); + assert_eq!(client.get_whitelist_page(&0, &10).len(), 0); + + let m1 = Address::generate(&env); + let m2 = Address::generate(&env); + let m3 = Address::generate(&env); + + client.add_merchant(&m1); + client.add_merchant(&m2); + client.add_merchant(&m3); + + // Idempotent double add does not increment index size + client.add_merchant(&m2); + + assert_eq!(client.get_whitelist_size(), 3); + + let page_all = client.get_whitelist_page(&0, &10); + assert_eq!(page_all.len(), 3); + assert_eq!(page_all.get(0).unwrap(), m1); + assert_eq!(page_all.get(1).unwrap(), m2); + assert_eq!(page_all.get(2).unwrap(), m3); + + // Test pagination offset & limit + let page_subset = client.get_whitelist_page(&1, &1); + assert_eq!(page_subset.len(), 1); + assert_eq!(page_subset.get(0).unwrap(), m2); + + // Remove middle item (m2) -> swap-remove moves m3 into index 1 + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); + + let page_after_remove = client.get_whitelist_page(&0, &10); + assert_eq!(page_after_remove.len(), 2); + assert_eq!(page_after_remove.get(0).unwrap(), m1); + assert_eq!(page_after_remove.get(1).unwrap(), m3); + + // Idempotent double remove does nothing + client.remove_merchant(&m2); + assert_eq!(client.get_whitelist_size(), 2); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #2)")] +fn test_subscription_amount_validation_zero() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount to 0 (panics with AmountMustBePositive, error 19) + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &0); +} + +#[test] +#[should_panic(expected = "HostError: Error(Contract, #15)")] +fn test_subscription_amount_validation_exceeds_max() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + // Attempt to set amount above MAX_SUBSCRIPTION_AMOUNT + env.mock_all_auths(); + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.set_subscription_amount(&user, &(crate::MAX_SUBSCRIPTION_AMOUNT + 1)); +} + +#[test] +fn test_batch_charge_estimate() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let users = soroban_sdk::vec![&env, user.clone()]; + let estimate = client.get_batch_charge_estimate(&users); + + assert_eq!(estimate.len(), 1); + assert_eq!( + estimate.get(0).unwrap(), + crate::batch::ChargeResult::NoSubscription + ); +} + +#[test] +fn test_contract_config() { + let (env, contract_id, token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + let config = client.get_contract_config(); + assert_eq!(config.schema_version, 3); + assert_eq!(config.paused, false); +} + +#[test] +fn test_daily_spent_reset() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&token_addr, &admin); + + assert!(client.get_day_start(&user).is_none()); +} + +// ───────────────────────────────────────────────────────────── +// Issue #11: extend_subscriber_index_ttl tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_extend_subscriber_index_ttl_empty_index_noop() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + assert_eq!(client.get_subscriber_count(), 0); + client.extend_subscriber_index_ttl(); + assert_eq!(client.get_subscriber_count(), 0); +} + +#[test] +fn test_extend_subscriber_index_ttl_emits_event_with_count() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let user_b = setup_funded_user(&env, &contract_id, &token_addr); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.subscribe( + &user_b, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!(client.get_subscriber_count(), 2); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_ttl_extended") + ); + assert_eq!(count, 2); +} + +#[test] +fn test_extend_subscriber_index_ttl_extends_large_index() { + use soroban_sdk::testutils::storage::Persistent as _; + + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + for _ in 0..5 { + let u = setup_funded_user(&env, &contract_id, &token_addr); + client.subscribe(&u, &merchant, &1_0000000, &86400, &token_addr, &None, &None); + users.push_back(u); + } + + assert_eq!(client.get_subscriber_count(), 5); + + client.extend_subscriber_index_ttl(); + + let events = env.events().all(); + let (_, _, data) = events.get(events.len() - 1).unwrap(); + let count: u64 = data.try_into_val(&env).unwrap(); + assert_eq!(count, 5); + + env.as_contract(&contract_id, || { + let ttl = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndexSize); + assert!(ttl >= SUBSCRIPTION_TTL_LEDGERS); + + let ttl_0 = env + .storage() + .persistent() + .get_ttl(&DataKey::SubscriberIndex(0)); + assert!(ttl_0 >= SUBSCRIPTION_TTL_LEDGERS); + }); +} + +#[test] +#[should_panic] +fn test_extend_subscriber_index_ttl_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + env.set_auths(&[]); + + client.extend_subscriber_index_ttl(); +} + +// ───────────────────────────────────────────────────────────── +// Issue #838: clear_subscriber_index_entry admin repair +// ───────────────────────────────────────────────────────────── + +/// Simulate a stale index slot: the subscription is inactive but the +/// append-only index was never tombstoned (the corruption this repair +/// entrypoint is meant to fix). +fn deactivate_subscription_leaving_index(env: &Env, contract_id: &Address, user: &Address) { + env.as_contract(contract_id, || { + let mut sub = storage::get_subscription(env, user).expect("subscription"); + sub.active = false; + storage::set_subscription(env, user, &sub); + }); +} + +#[test] +fn test_clear_subscriber_index_entry_authorized_repair_tombstones_stale_slot() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + assert_eq!(client.get_subscriber_at(&0u64), Some(user.clone())); + + deactivate_subscription_leaving_index(&env, &contract_id, &user); + assert_eq!( + client.get_subscriber_at(&0u64), + Some(user.clone()), + "stale slot must still be visible before repair" + ); + + client.clear_subscriber_index_entry(&0u64); + + assert_eq!( + client.get_subscriber_at(&0u64), + None, + "repaired slot must be tombstoned" + ); + let page = client.get_subscriber_page(&0u64, &10u32); + assert_eq!(page.len(), 0); + assert_eq!( + client.get_subscriber_count(), + 1, + "repair must not shrink the append-only index" + ); +} + +#[test] +#[should_panic] +fn test_clear_subscriber_index_entry_unauthorized_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + env.set_auths(&[]); + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +#[should_panic(expected = "Error(Contract, #41)")] +fn test_clear_subscriber_index_entry_refuses_active_subscriber() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.clear_subscriber_index_entry(&0u64); +} + +#[test] +fn test_clear_subscriber_index_entry_emits_audit_event() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let admin = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + deactivate_subscription_leaving_index(&env, &contract_id, &user); + + client.clear_subscriber_index_entry(&0u64); + + let events = env.events().all(); + let (_, topics, data) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + let topic_user: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + let index: u64 = data.try_into_val(&env).unwrap(); + + assert_eq!( + topic_symbol, + Symbol::new(&env, "subscriber_index_cleared") + ); + assert_eq!(topic_user, user); + assert_eq!(index, 0); +} + +// ───────────────────────────────────────────────────────────── +// Issue #610: get_subscription_token tests +// ───────────────────────────────────────────────────────────── + +/// get_subscription_token returns None before the user subscribes. +#[test] +fn test_get_subscription_token_none_before_subscribe() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let random = Address::generate(&env); + assert!( + client.get_subscription_token(&random).is_none(), + "get_subscription_token should return None for a user with no subscription" + ); +} + +/// get_subscription_token returns Some(token) after subscribe. +#[test] +fn test_get_subscription_token_some_after_subscribe() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) after subscribe" + ); +} + +/// get_subscription_token still returns Some(token) after cancel — the record +/// exists but is inactive; callers that need to distinguish active vs cancelled +/// should use get_subscription instead. +#[test] +fn test_get_subscription_token_some_after_cancel() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + client.cancel(&user); + + // The subscription record still exists (active=false), so token is still readable. + assert_eq!( + client.get_subscription_token(&user), + Some(token_addr), + "get_subscription_token should return Some(token) for cancelled subscription" + ); +} + +/// get_subscription_token reflects the token when the user re-subscribes with +/// a different token. +#[test] +fn test_get_subscription_token_updates_on_resubscribe() { + let (env, contract_id, token_a, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, &merchant, &1_0000000, &86400, &token_a, &None, &None, + ); + assert_eq!(client.get_subscription_token(&user), Some(token_a.clone())); + + let token_b = setup_second_token(&env, &contract_id, &user); + client.subscribe( + &user, &merchant, &2_0000000, &86400, &token_b, &None, &None, + ); + + assert_eq!( + client.get_subscription_token(&user), + Some(token_b), + "get_subscription_token should return the latest token after resubscribe" + ); +} + +// ───────────────────────────────────────────────────────────── +// Issue #611: propose_fee / commit_fee two-step tests +// ───────────────────────────────────────────────────────────── + +/// Full propose → commit flow sets the fee collector and bps. +#[test] +fn test_propose_and_commit_fee_sets_fee() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &250); + client.commit_fee(); + + let result = client.get_fee(); + assert!(result.is_some()); + let (stored_collector, stored_bps) = result.unwrap(); + assert_eq!(stored_collector, collector); + assert_eq!(stored_bps, 250); +} + +/// propose_fee emits a fee_proposed event. +#[test] +fn test_propose_fee_emits_fee_proposed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_proposed")); +} + +/// commit_fee emits a fee_committed event. +#[test] +fn test_commit_fee_emits_fee_committed_event() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &50); + client.commit_fee(); + + let events = env.events().all(); + let (_, topics, _) = events.get(events.len() - 1).unwrap(); + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(topic_symbol, Symbol::new(&env, "fee_committed")); +} + +/// commit_fee without a prior propose panics with NoPendingProposal (#23). +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_commit_fee_without_proposal_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.commit_fee(); +} + +/// propose_fee with bps > 10000 panics with InvalidFeeBps (#13). +#[test] +#[should_panic(expected = "Error(Contract, #13)")] +fn test_propose_fee_invalid_bps_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_001); +} + +/// A re-propose before commit replaces the pending fee — commit applies +/// the latest proposal. +#[test] +fn test_repropose_before_commit_applies_latest() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector_a = Address::generate(&env); + let collector_b = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector_a, &100); + // Re-propose with different values before committing + client.propose_fee(&collector_b, &200); + client.commit_fee(); + + let (stored_collector, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_collector, collector_b); + assert_eq!(stored_bps, 200); +} + +/// After commit_fee, committing again without a new propose panics. +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_double_commit_without_repropose_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &100); + client.commit_fee(); + // Second commit without a new propose must panic + client.commit_fee(); +} + +/// Bps of exactly 10000 (100%) is valid at both propose and commit. +#[test] +fn test_propose_fee_max_valid_bps() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &10_000); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 10_000); +} + +/// Bps of 0 is valid (disabling the fee while keeping the collector). +#[test] +fn test_propose_fee_zero_bps_valid() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.propose_fee(&collector, &0); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 0); +} + +/// Non-admin calling propose_fee panics. +#[test] +#[should_panic] +fn test_propose_fee_non_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + // No admin set; require_admin call inside propose_fee should panic. + // NOTE: propose_fee in lib.rs calls bump_instance_ttl then fee::propose_fee. + // fee::propose_fee itself does not require_admin — the admin guard + // is the caller's responsibility in lib.rs. We verify the whole + // public entry point panics when no admin is configured. + let collector = Address::generate(&env); + + // Explicitly set an admin so admin check works, then revoke auths. + client.propose_fee(&collector, &100); +} + +// ───────────────────────────────────────────── +// Issue 012: commit_fee bounds re-validation +// ───────────────────────────────────────────── + +/// commit_fee rejects when bounds tightened after propose (bps above new max). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_above_max() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 500 bps — within default bounds (0, 10000) + client.propose_fee(&collector, &500); + + // Tighten max to 200 bps before commit + client.set_fee_bounds(&0, &200); + + // Commit should reject 500 bps against new [0, 200] bounds + client.commit_fee(); +} + +/// commit_fee rejects when bounds tightened after propose (bps below new min). +#[test] +#[should_panic(expected = "Error(Contract, #35)")] +fn test_commit_fee_rejects_when_bounds_tightened_below_min() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Propose 50 bps + client.propose_fee(&collector, &50); + + // Raise min to 100 bps before commit + client.set_fee_bounds(&100, &10000); + + // Commit should reject 50 bps against new [100, 10000] bounds + client.commit_fee(); +} + +/// commit_fee succeeds when pending bps are within current bounds. +#[test] +fn test_commit_fee_succeeds_when_within_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + client.set_fee_bounds(&10, &500); + client.propose_fee(&collector, &200); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 200); +} + +/// commit_fee succeeds when no bounds are configured (defaults to 0..10000). +#[test] +fn test_commit_fee_succeeds_with_default_bounds() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let collector = Address::generate(&env); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // No set_fee_bounds call — defaults to (0, 10000) + client.propose_fee(&collector, &750); + client.commit_fee(); + + let (_, stored_bps) = client.get_fee().unwrap(); + assert_eq!(stored_bps, 750); +} + +// ───────────────────────────────────────────── +// Batch queries tests +// ───────────────────────────────────────────── + +#[test] +fn test_get_merchant_statuses_empty() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.get_merchant_statuses(&merchants); + assert_eq!(result.len(), 0); +} + +#[test] +fn test_get_merchant_statuses_mixed() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); +} + +// Issue #9: validate_recipient_address tests +// ───────────────────────────────────────────── + +/// set_fee() with a valid (non-contract) collector address must succeed. +#[test] +fn test_validate_recipient_address_valid_passes() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + // Must not panic — a regular address is a valid fee collector. + client.propose_fee(&collector, &100u32); + client.commit_fee(); + + assert_eq!(client.get_fee(), Some((collector, 100u32))); +} + +/// set_fee() with the contract's own address as collector must panic with +/// ContractError::InvalidFeeCollector (error code 26). +#[test] +#[should_panic(expected = "Error(Contract, #26)")] +fn test_validate_recipient_address_contract_self_panics() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + // Passing the contract address as fee collector must be rejected. + client.propose_fee(&contract_id, &100u32); + client.commit_fee(); +} +// ───────────────────────────────────────────────────────────── +// Issue #3: Per-Merchant Fee Recipient Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_set_and_get_merchant_fee_recipient() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + assert_eq!( + client.get_merchant_fee_recipient(&merchant), + Some(custom_recipient) + ); +} + +#[test] +fn test_set_merchant_fee_recipient_contract_address_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let res = client.try_set_merchant_fee_recipient(&merchant, &contract_id); + assert!(res.is_err()); +} + +#[test] +fn test_merchant_fee_recipient_routing_and_fallback() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(86400); + client.charge(&user); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + env.ledger().set_timestamp(172800); + client.charge(&user); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_merchant_statuses_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut merchants = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + merchants.push_back(Address::generate(&env)); + } + client.get_merchant_statuses(&merchants); +} + +#[test] +fn test_get_next_charge_batch_empty_and_bounds() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 0); + + let batch_oob = client.get_next_charge_batch(&5, &10, &None); + assert_eq!(batch_oob.len(), 0); +} + +#[test] +fn test_get_next_charge_batch_filtering() { + let (env, contract_id, token_addr, user_due, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_not_due = setup_funded_user(&env, &contract_id, &token_addr); + let user_paused = setup_funded_user(&env, &contract_id, &token_addr); + let user_cancelled = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_paused, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user_cancelled, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + client.pause(&user_paused); + client.cancel(&user_cancelled); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + client.subscribe(&user_not_due, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + let batch = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user_due); +} + +#[test] +fn test_get_next_charge_batch_pagination() { + let (env, contract_id, token_addr, user1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user2 = setup_funded_user(&env, &contract_id, &token_addr); + let user3 = setup_funded_user(&env, &contract_id, &token_addr); + + let interval: u64 = 86400; + + client.subscribe(&user1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + client.subscribe(&user3, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let batch1 = client.get_next_charge_batch(&0, &2, &None); + assert_eq!(batch1.len(), 2); + assert_eq!(batch1.get(0).unwrap(), user1); + assert_eq!(batch1.get(1).unwrap(), user2); + + let batch2 = client.get_next_charge_batch(&2, &2, &None); + assert_eq!(batch2.len(), 1); + assert_eq!(batch2.get(0).unwrap(), user3); +} + +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_get_next_charge_batch_exceeds_limit_panics() { + let (env, contract_id, _, _, _) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.get_next_charge_batch(&0, &51, &None); +} + +#[test] +fn test_get_next_charge_batch_exclude_lapsed() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + let grace_period: u64 = 86400; + client.propose_grace_period(&grace_period); + client.commit_grace_period(); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &1_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + // Advance ledger beyond interval, but WITHIN grace period + env.ledger().with_mut(|l| { + l.timestamp += interval + grace_period - 100; + }); + + // It should be returned because it's due and not lapsed + let batch = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch.len(), 1); + assert_eq!(batch.get(0).unwrap(), user); + + // Advance ledger beyond interval + grace period + env.ledger().with_mut(|l| { + l.timestamp += 200; // past the grace period + }); + + // When exclude_lapsed is Some(true) or None, it should NOT be returned + let batch_exclude = client.get_next_charge_batch(&0, &10, &Some(true)); + assert_eq!(batch_exclude.len(), 0); + + let batch_default = client.get_next_charge_batch(&0, &10, &None); + assert_eq!(batch_default.len(), 0); + + // When exclude_lapsed is Some(false), it should be returned + let batch_include = client.get_next_charge_batch(&0, &10, &Some(false)); + assert_eq!(batch_include.len(), 1); + assert_eq!(batch_include.get(0).unwrap(), user); +} + +#[test] +fn test_merchant_fee_recipient_routes_pay_per_use_and_falls_back() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let global_collector = Address::generate(&env); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + client.propose_fee(&global_collector, &100); + client.commit_fee(); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 990); + + let custom_recipient = Address::generate(&env); + client.set_merchant_fee_recipient(&merchant, &custom_recipient); + + client.pay_per_use(&user, &1000); + assert_eq!(token.balance(&custom_recipient), 10); + assert_eq!(token.balance(&global_collector), 10); + assert_eq!(token.balance(&merchant), 1980); +} + +// ───────────────────────────────────────────────────────────── +// Issue #4: Bounded Pause with Auto-Resume Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_pause_until_auto_resume_on_charge() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(86400); + let res = client.try_charge(&user); + assert!(res.is_err()); + + env.ledger().set_timestamp(90000); + client.charge(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + assert_eq!(token.balance(&merchant), 1000); +} + +#[test] +fn test_pause_until_invalid_expiry_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + env.ledger().set_timestamp(200000); + let res = client.try_pause_until(&user, &200000); + assert!(res.is_err()); + let res2 = client.try_pause_until(&user, &150000); + assert!(res2.is_err()); +} + +#[test] +fn test_resume_clears_pause_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + client.pause_until(&user, &300000); + client.resume(&user); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +#[test] +fn test_pause_until_auto_resume_on_batch_charge_and_clears_expiry() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + client.pause_until(&user, &90000); + + env.ledger().set_timestamp(90000); + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + let result = client.batch_charge(&users); + assert_eq!(result.get(0).unwrap(), crate::ChargeResult::Charged); + + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.paused, false); + assert_eq!(sub.active, true); + + env.as_contract(&contract_id, || { + let pause_expiry: Option = env + .storage() + .persistent() + .get(&DataKey::PauseExpiry(user.clone())); + assert_eq!(pause_expiry, None); + }); +} + +// ───────────────────────────────────────────────────────────── +// Issue #5: get_referral Read Function Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_get_referral_lifecycle() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer.clone())); + + client.cancel(&user); + assert_eq!(client.get_referral(&user), None); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + assert_eq!(client.get_referral(&user), Some(referrer)); +} + +// ───────────────────────────────────────────────────────────── +// Issue #6: Storage Migration v3 Tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_migration_v2_to_v3_populates_referrer() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let referrer = Address::generate(&env); + + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + client.subscribe( + &user, + &merchant, + &1000, + &86400, + &token_addr, + &None, + &Some(referrer.clone()), + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::SchemaVersion, &2u32); + }); + + assert_eq!(client.get_schema_version(), 2); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user.clone()); + + client.migrate(&users); + + assert_eq!(client.get_schema_version(), 3); + let sub = client.get_subscription(&user).unwrap(); + assert_eq!(sub.referrer, Some(referrer)); + + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +// ───────────────────────────────────────────────────────────── +// Issue 011: ChargeResult discriminant stability (golden tests) +// ───────────────────────────────────────────────────────────── +// +// Off-chain parsers (keepers, alert-failed-charges.ts, indexers) +// decode ChargeResult by variant index. These tests lock the +// discriminant layout so a reorder or rename is caught in CI. + +/// The number of ChargeResult variants. If you add a new variant, +/// update this count AND append the new variant at the end of the enum. +#[test] +fn test_charge_result_variant_count() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + // Encode each variant via IntoVal and verify they produce distinct values. + // This also serves as a compile-time check: if a variant is removed or + // renamed, this test won't compile (exhaustive pattern match). + let charged: soroban_sdk::Val = ChargeResult::Charged.into_val(&env); + let skipped: soroban_sdk::Val = ChargeResult::Skipped.into_val(&env); + let no_sub: soroban_sdk::Val = ChargeResult::NoSubscription.into_val(&env); + let inactive: soroban_sdk::Val = ChargeResult::Inactive.into_val(&env); + let paused: soroban_sdk::Val = ChargeResult::Paused.into_val(&env); + let grace: soroban_sdk::Val = ChargeResult::GracePeriodElapsed.into_val(&env); + + // All variants must encode to distinct raw values + let c = unsafe { core::mem::transmute::(charged) }; + let s = unsafe { core::mem::transmute::(skipped) }; + let n = unsafe { core::mem::transmute::(no_sub) }; + let i = unsafe { core::mem::transmute::(inactive) }; + let p = unsafe { core::mem::transmute::(paused) }; + let g = unsafe { core::mem::transmute::(grace) }; + + assert_ne!(c, s, "Charged and Skipped must differ"); + assert_ne!(s, n, "Skipped and NoSubscription must differ"); + assert_ne!(n, i, "NoSubscription and Inactive must differ"); + assert_ne!(i, p, "Inactive and Paused must differ"); + assert_ne!(p, g, "Paused and GracePeriodElapsed must differ"); + + // Lock the variant count — increase when a variant is appended. + let total_variants = 6; + assert_eq!(total_variants, 6); +} + +/// Verify round-trip encoding for every variant. +#[test] +fn test_charge_result_round_trip() { + let env = Env::default(); + let _ = env.register_contract(None, FlowPay); + + let variants = [ + ChargeResult::Charged, + ChargeResult::Skipped, + ChargeResult::NoSubscription, + ChargeResult::Inactive, + ChargeResult::Paused, + ChargeResult::GracePeriodElapsed, + ]; + + for variant in variants.iter() { + let val: soroban_sdk::Val = variant.clone().into_val(&env); + let decoded = ChargeResult::try_from_val(&env, &val).unwrap(); + assert_eq!(*variant, decoded, "round-trip failed for a ChargeResult variant"); + } +} + +/// Verify that variant names match the expected set. +/// A rename or reorder breaks this test. +#[test] +fn test_charge_result_partial_eq_identity() { + assert_eq!(ChargeResult::Charged, ChargeResult::Charged); + assert_ne!(ChargeResult::Charged, ChargeResult::Skipped); + assert_ne!(ChargeResult::NoSubscription, ChargeResult::Inactive); + assert_ne!(ChargeResult::Paused, ChargeResult::GracePeriodElapsed); +} + + +// ───────────────────────────────────────────── +// CONTRACT-804: checked arithmetic in trial, fee, and volume paths +// ───────────────────────────────────────────── + +#[test] +fn test_extend_trial_pushes_last_charged_forward() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.extend_trial(&user, &86400); + + assert_eq!( + client.get_subscription(&user).unwrap().last_charged, + before + 86400 + ); +} + +/// A trial extension past `u64::MAX` must fail closed with the typed +/// `ArithmeticOverflow` (#36) rather than an untyped `unwrap` panic. +#[test] +fn test_extend_trial_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + + // Push last_charged to the u64 ceiling, then ask for one second more. + client.extend_trial(&user, &(u64::MAX - client.get_subscription(&user).unwrap().last_charged)); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, u64::MAX); + + let res = client.try_extend_trial(&user, &1); + + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// Extending a paused subscription's trial must fail closed with the typed +/// `SubscriptionPaused` (#17) error rather than advancing `last_charged` into +/// a chargeable state. +#[test] +fn test_extend_trial_on_paused_subscription_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe(&user, &merchant, &1000, &86400, &token_addr, &None, &None); + let before = client.get_subscription(&user).unwrap().last_charged; + + client.pause(&user); + + let res = client.try_extend_trial(&user, &86400); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(17)))); + assert_eq!(client.get_subscription(&user).unwrap().last_charged, before); +} + +/// `amount * bps` must not wrap for amounts beyond the economic caps. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_calculate_fee_amount_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + fee::calculate_fee_amount(&env, i128::MAX, 10_000); + }); +} + +#[test] +fn test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + // The largest amount the contract will accept, at the maximum bps. + assert_eq!( + fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 10_000), + MAX_SUBSCRIPTION_AMOUNT + ); + assert_eq!(fee::calculate_fee_amount(&env, MAX_SUBSCRIPTION_AMOUNT, 0), 0); + }); +} + +/// Accruing a fee onto a `TotalProtocolFees` counter at `i128::MAX` must fail +/// closed rather than wrap the protocol's own bookkeeping. +#[test] +fn test_protocol_fee_accrual_overflow_fails_with_typed_error() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + configure_fee(&env, &contract_id, 500); + + let interval: u64 = 86400; + client.subscribe( + &user, + &merchant, + &10_0000000, + &interval, + &token_addr, + &None, + &None, + ); + + env.as_contract(&contract_id, || { + env.storage() + .instance() + .set(&DataKey::TotalProtocolFees, &i128::MAX); + }); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let res = client.try_charge(&user); + assert_eq!(res, Err(Ok(soroban_sdk::Error::from_contract_error(36)))); +} + +/// An accumulator that cannot represent the sum is an overflow (#36), which is +/// a different failure from breaching the hourly cap (#28). +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_accumulator_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: env.ledger().timestamp(), + accumulated_volume: i128::MAX, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// A window start near `u64::MAX` must not wrap the rollover comparison. +#[test] +#[should_panic(expected = "Error(Contract, #36)")] +fn test_global_volume_window_end_overflow_fails_with_typed_error() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + env.storage().instance().set( + &DataKey::GlobalVolumeWindow, + &GlobalVolumeWindow { + current_window_start: u64::MAX, + accumulated_volume: 0, + }, + ); + check_and_update_global_volume(&env, 1); + }); +} + +/// Breaching the hourly cap still reports `GlobalVolumeExceeded` (#28) — +/// the overflow work above must not have changed the cap's error mapping. +#[test] +#[should_panic(expected = "Error(Contract, #28)")] +fn test_global_volume_cap_breach_still_reports_28() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + + env.as_contract(&contract_id, || { + check_and_update_global_volume(&env, GLOBAL_MAX_VOLUME_PER_HOUR + 1); + }); +} + +// ───────────────────────────────────────────── +// CONTRACT-805: batch_charge_skips summary event +// ───────────────────────────────────────────── + +/// Helper: returns the payload of the single `batch_charge_skips` event in the +/// event log, or `None` when no such event was emitted. +fn find_batch_charge_skips(env: &Env) -> Option { + let mut found = None; + for (_, topics, data) in env.events().all().iter() { + let topic_symbol: Symbol = topics.get(0).unwrap().try_into_val(env).unwrap(); + if topic_symbol == Symbol::new(env, "batch_charge_skips") { + assert_eq!( + topics.len(), + 1, + "batch_charge_skips carries no address topic" + ); + assert!( + found.is_none(), + "at most one summary event per batch_charge call" + ); + found = Some(data.try_into_val(env).unwrap()); + } + } + found +} + +/// Helper: funds a fresh user and subscribes them for `interval`. +fn subscribe_funded_user( + env: &Env, + contract_id: &Address, + token_addr: &Address, + merchant: &Address, + interval: u64, +) -> Address { + let client = FlowPayClient::new(env, contract_id); + let user = Address::generate(env); + let sac = StellarAssetClient::new(env, token_addr); + sac.mint(&user, &10_000_0000000); + let token = TokenClient::new(env, token_addr); + token.approve(&user, contract_id, &10_000_0000000, &200000); + client.subscribe( + &user, + merchant, + &1_0000000, + &interval, + token_addr, + &None, + &None, + ); + user +} + +/// A batch mixing charges with paused / cancelled / missing / grace-elapsed +/// subscriptions emits one summary event whose counts reconcile with the +/// returned results. +#[test] +fn test_batch_charge_emits_skips_summary_with_counts() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + install_admin(&env, &contract_id); + client.propose_grace_period(&3600); + client.commit_grace_period(); + + let paused_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let cancelled_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let grace_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + client.pause(&paused_user); + client.cancel(&cancelled_user); + + // Push grace_user past its interval AND its grace window. + env.ledger().with_mut(|l| { + l.timestamp += interval + 3601 + 1; + }); + + // Subscribe the chargeable user now, then advance just past its interval so + // it is due but still inside the grace window. + let chargeable = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(chargeable.clone()); + users.push_back(paused_user.clone()); + users.push_back(cancelled_user.clone()); + users.push_back(grace_user.clone()); + users.push_back(unknown_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Paused); + assert_eq!(results.get(2).unwrap(), ChargeResult::Inactive); + assert_eq!(results.get(3).unwrap(), ChargeResult::GracePeriodElapsed); + assert_eq!(results.get(4).unwrap(), ChargeResult::NoSubscription); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 5); + assert_eq!(summary.charged, 1); + assert_eq!(summary.not_due, 0); + assert_eq!(summary.paused, 1); + assert_eq!(summary.inactive, 1); + assert_eq!(summary.grace_elapsed, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.ledger_sequence, env.ledger().sequence()); + + // The counts must account for every submitted address. + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// An all-success batch must not emit the summary — and its `charged` events +/// are unchanged. +#[test] +fn test_batch_charge_all_charged_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), ChargeResult::Charged); + + assert!( + find_batch_charge_skips(&env).is_none(), + "an all-charged batch must stay silent" + ); + + // `charged` events are untouched by this feature. + let charged_events = env + .events() + .all() + .iter() + .filter(|(_, topics, _)| { + let s: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + s == Symbol::new(&env, "charged") + }) + .count(); + assert_eq!(charged_events, 2); +} + +/// Not-due skips are the common, uninteresting outcome and must not emit. +#[test] +fn test_batch_charge_not_due_only_emits_no_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let user_a = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let user_b = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(user_a.clone()); + users.push_back(user_b.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Skipped); + assert_eq!(results.get(1).unwrap(), ChargeResult::Skipped); + + assert!( + find_batch_charge_skips(&env).is_none(), + "a not-due-only batch must stay silent" + ); +} + +/// An allowance shortfall is a per-user `AllowanceInsufficient` result (it does +/// not abort the batch) and is an interesting failure: it alone must emit the +/// summary, since a keeper needs to know a subscriber has to re-approve. +#[test] +fn test_batch_charge_allowance_insufficient_counted_in_skips_summary() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + let interval: u64 = 86400; + + let ok_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let broke_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + + // One stroop short of the gross subscription amount. + token.approve(&broke_user, &contract_id, &(1_0000000 - 1), &200000); + + env.ledger().with_mut(|l| { + l.timestamp += interval + 1; + }); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(ok_user.clone()); + users.push_back(broke_user.clone()); + + let results = client.batch_charge(&users); + assert_eq!(results.get(0).unwrap(), ChargeResult::Charged); + assert_eq!( + results.get(1).unwrap(), + ChargeResult::AllowanceInsufficient + ); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.charged, 1); + assert_eq!(summary.allowance_insufficient, 1); + assert_eq!(summary.not_due, 0); + assert_eq!( + summary.charged + + summary.not_due + + summary.paused + + summary.inactive + + summary.grace_elapsed + + summary.no_subscription + + summary.allowance_insufficient, + summary.total + ); +} + +/// A single interesting failure alongside not-due skips is enough to emit, +/// and the not-due count rides along for reconciliation. +#[test] +fn test_batch_charge_single_interesting_failure_emits_with_not_due_count() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let interval: u64 = 86400; + + let not_due_user = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, interval); + let unknown_user = Address::generate(&env); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(not_due_user.clone()); + users.push_back(unknown_user.clone()); + + client.batch_charge(&users); + + let summary = find_batch_charge_skips(&env).expect("expected a batch_charge_skips event"); + assert_eq!(summary.total, 2); + assert_eq!(summary.not_due, 1); + assert_eq!(summary.no_subscription, 1); + assert_eq!(summary.charged, 0); +} + +// ───────────────────────────────────────────────────────────── +// Issue #801 (Issue 005): simulate_charge / get_batch_charge_estimate +// parity matrix. +// ───────────────────────────────────────────────────────────── +// +// These cases exhaust the existing skip/pause/grace/inactive/ +// not-due/missing-subscription/contract-paused matrix and +// verify that both dry-run surfaces reach semantically +// equivalent decisions (modulo the intentional enum-mapping +// differences documented in charge_exec.rs at +// DryRunSkipOutcome::into_sim_result / into_batch_result). + +/// Semantic skip-category labels shared by the parity matrix. +/// The test asserts that both callers land in the same +/// high-level category for each scenario. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +enum ParityCategory { + NoSubscription, + ContractPaused, + SubscriptionPaused, + Inactive, + NotDue, + GracePeriodElapsed, + WouldCharge, +} + +fn categorize_sim(r: &ChargeSimResult) -> ParityCategory { + match r { + ChargeSimResult::WouldSucceed => ParityCategory::WouldCharge, + ChargeSimResult::NotDue => ParityCategory::NotDue, + ChargeSimResult::Inactive => ParityCategory::Inactive, + ChargeSimResult::InsufficientAllowance => ParityCategory::WouldCharge, + ChargeSimResult::GracePeriodElapsed => ParityCategory::GracePeriodElapsed, + ChargeSimResult::ContractPaused => ParityCategory::ContractPaused, + ChargeSimResult::SubscriptionPaused => ParityCategory::SubscriptionPaused, + } +} + +fn categorize_batch(r: &ChargeResult) -> ParityCategory { + match r { + ChargeResult::Charged => ParityCategory::WouldCharge, + ChargeResult::Skipped => ParityCategory::NotDue, + ChargeResult::NoSubscription => ParityCategory::NoSubscription, + ChargeResult::Inactive => ParityCategory::Inactive, + ChargeResult::Paused => ParityCategory::SubscriptionPaused, + ChargeResult::GracePeriodElapsed => ParityCategory::GracePeriodElapsed, + ChargeResult::AllowanceInsufficient => ParityCategory::WouldCharge, + } +} + +/// Returns (now, interval, grace_period, amount) constants for +/// the parity test setup so row config is readable. +struct ParityConfig { + interval: u64, + grace: u64, + amount: i128, +} + +const PARITY_CFG: ParityConfig = ParityConfig { + interval: 86400, + grace: 3600, + amount: 1_0000000, +}; + +/// Description and setup function for a single parity-matrix +/// row. Setup runs inside a fresh `setup()` context. The +/// returned label is printed on assertion failure so it is +/// clear which row diverged. +struct ParityRow { + label: &'static str, + expected: ParityCategory, + setup: fn(env: &Env, client: &FlowPayClient, user: &Address, merchant: &Address, token_addr: &Address, contract_id: &Address), +} + +fn parity_rows() -> std::vec::Vec { + std::vec![ + ParityRow { + label: "no subscription", + expected: ParityCategory::NoSubscription, + setup: |_env, _client, _user, _merchant, _token_addr, _contract_id| { + // Intentionally do not subscribe the user. + }, + }, + ParityRow { + label: "contract paused", + expected: ParityCategory::ContractPaused, + setup: |env, client, user, merchant, token_addr, contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); + env.as_contract(contract_id, || { + storage::set_contract_paused(env, true); + }); + }, + }, + ParityRow { + label: "paused indefinitely", + expected: ParityCategory::SubscriptionPaused, + setup: |_env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + client.pause(user); + }, + }, + ParityRow { + label: "paused with expiry — before expiry reached", + expected: ParityCategory::SubscriptionPaused, + setup: |env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + let now = env.ledger().timestamp(); + let expiry = now + 600; + client.pause_until(user, &expiry); + env.ledger().with_mut(|l| l.timestamp = expiry - 1); + }, + }, + ParityRow { + label: "paused with expiry — at expiry + interval not yet elapsed (auto-resume -> not due)", + expected: ParityCategory::NotDue, + setup: |env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + let now = env.ledger().timestamp(); + // expiry well before interval would be due + let expiry = now + 600; + client.pause_until(user, &expiry); + // advance to exactly expiry (auto-resumes), but subscription + // interval is 86400s so charge is not yet due. + env.ledger().with_mut(|l| l.timestamp = expiry); + }, + }, + ParityRow { + label: "paused with expiry — past expiry + interval elapsed (auto-resume -> would charge)", + expected: ParityCategory::WouldCharge, + setup: |env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + let now = env.ledger().timestamp(); + let expiry = now + 600; + client.pause_until(user, &expiry); + // past both expiry and interval. + env.ledger().with_mut(|l| l.timestamp = expiry + PARITY_CFG.interval + 1); + }, + }, + ParityRow { + label: "inactive (cancelled)", + expected: ParityCategory::Inactive, + setup: |env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + client.cancel(user); + env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); + }, + }, + ParityRow { + label: "not due (interval not elapsed)", + expected: ParityCategory::NotDue, + setup: |_env, client, user, merchant, token_addr, _contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + // Immediately after subscribe, next charge is interval away. + }, + }, + ParityRow { + label: "due and within grace window", + expected: ParityCategory::WouldCharge, + setup: |env, client, user, merchant, token_addr, contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + env.as_contract(contract_id, || { + env.storage() + .instance() + .set(&DataKey::GracePeriod, &PARITY_CFG.grace); + }); + // Advance past interval but still inside grace window. + env.ledger().with_mut(|l| l.timestamp += PARITY_CFG.interval + 1); + }, + }, + ParityRow { + label: "grace period elapsed", + expected: ParityCategory::GracePeriodElapsed, + setup: |env, client, user, merchant, token_addr, contract_id| { + client.subscribe( + user, merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + token_addr, &None, &None, + ); + env.as_contract(contract_id, || { + env.storage() + .instance() + .set(&DataKey::GracePeriod, &PARITY_CFG.grace); + }); + env.ledger().with_mut(|l| { + l.timestamp += PARITY_CFG.interval + PARITY_CFG.grace + 1; + }); + }, + }, + ParityRow { + label: "missing subscription (fresh user, never subscribed)", + expected: ParityCategory::NoSubscription, + setup: |_env, _client, _user, _merchant, _token_addr, _contract_id| { + // Nothing to do; user has never subscribed. + }, + }, + ] +} + +#[test] +fn test_simulate_and_batch_estimate_skip_parity_matrix() { + let rows = parity_rows(); + for row in rows.iter() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + (row.setup)(&env, &client, &user, &merchant, &token_addr, &contract_id); + + let sim = client.simulate_charge(&user); + let sim_cat = categorize_sim(&sim); + + let users_vec = soroban_sdk::vec![&env, user.clone()]; + let estimates = client.get_batch_charge_estimate(&users_vec); + let est = estimates.get(0).expect("estimate vec has one entry"); + let est_cat = categorize_batch(&est); + + // ═══════════════════════════════════════════════════════ + // The two rows below are the *only* places where the + // parity matrix tolerates a divergence: + // (1) NoSubscription: simulate_charge returns Inactive + // (historic API); estimate returns NoSubscription + // (matches live batch_charge). Category labels + // differ intentionally; both mean "no charge". + // (2) ContractPaused: simulate_charge returns + // ContractPaused; estimate has no matching variant + // (ChargeResult is frozen for off-chain consumers) + // so it falls back to Inactive. Both callers + // agree that the charge would not proceed. + // ═══════════════════════════════════════════════════════ + let est_cat_adjusted = match (row.expected, est_cat) { + (ParityCategory::NoSubscription, ParityCategory::NoSubscription) => { + // simulate collapses missing -> Inactive category. + ParityCategory::Inactive + } + (ParityCategory::ContractPaused, ParityCategory::Inactive) => { + // estimate maps contract-paused -> Inactive. + ParityCategory::ContractPaused + } + _ => est_cat, + }; + + assert_eq!( + sim_cat, est_cat_adjusted, + "parity divergence on row '{}': simulate={:?} (cat={:?}), estimate={:?} (cat={:?})", + row.label, sim, sim_cat, est, est_cat, + ); + assert_eq!( + sim_cat, row.expected, + "simulate_charge reached wrong category on row '{}': got {:?}, want {:?}", + row.label, sim_cat, row.expected, + ); + } +} + +/// Additional, narrower check: when both dry-run surfaces say +/// "would charge", neither has mutated storage (the virtual +/// auto-resume inside the shared precheck must remain local). +#[test] +fn test_estimate_does_not_perform_auto_resume_storage_writes() { +// Issue 041 (#836): MerchantFeeRecipient clearing tests +// ───────────────────────────────────────────────────────────── + +#[test] +fn test_merchant_fee_recipient_cleared_on_remove_and_freeze() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + let recipient = Address::generate(&env); + + client.add_merchant(&merchant); + client.set_merchant_fee_recipient(&merchant, &recipient); + assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); + + client.remove_merchant(&merchant); + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); + + client.add_merchant(&merchant); + client.set_merchant_fee_recipient(&merchant, &recipient); + assert_eq!(client.get_merchant_fee_recipient(&merchant), Some(recipient.clone())); + + client.freeze_merchant(&merchant, &None); + assert_eq!(client.get_merchant_fee_recipient(&merchant), None); +} + +// ───────────────────────────────────────────────────────────── +// Issue 033 (#828): Grace period TTL expiry tests +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #23)")] +fn test_grace_period_commit_expired_proposal_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + client.propose_grace_period(&3600); + + env.ledger().with_mut(|l| { + l.sequence_number += 20000; + }); + + client.commit_grace_period(); +} + +#[test] +fn test_grace_period_propose_commit_happy_path() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let admin = Address::generate(&env); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &admin); + }); + + let client = FlowPayClient::new(&env, &contract_id); + client.propose_grace_period(&7200); + + env.ledger().with_mut(|l| { + l.sequence_number += 100; + }); + + client.commit_grace_period(); + assert_eq!(client.get_grace_period(), 7200); +} + +// ───────────────────────────────────────────────────────────── +// Issue 034 (#829): Self-transfer & contract-as-user hazards +// ───────────────────────────────────────────────────────────── + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_transfer_subscription_self_transfer_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, &merchant, + &PARITY_CFG.amount, &PARITY_CFG.interval, + &token_addr, &None, &None, + ); + let now = env.ledger().timestamp(); + let expiry = now + 600; + client.pause_until(&user, &expiry); + env.ledger().with_mut(|l| l.timestamp = expiry + PARITY_CFG.interval + 1); + + // Sanity-check: user is currently paused in storage. + let sub_before = client.get_subscription(&user).unwrap(); + assert!(sub_before.paused, "sub must be paused before estimate call"); + let pause_expiry_before = env.as_contract(&contract_id, || { + storage::get_pause_expiry(&env, &user) + }); + assert!(pause_expiry_before.is_some(), "pause expiry must exist"); + + // Run the estimate — must be WouldCharge (via virtual auto-resume). + let users_vec = soroban_sdk::vec![&env, user.clone()]; + let estimates = client.get_batch_charge_estimate(&users_vec); + assert_eq!( + estimates.get(0).unwrap(), + ChargeResult::Charged, + "estimate should report WouldCharge via virtual auto-resume" + ); + let sim = client.simulate_charge(&user); + assert_eq!( + sim, + ChargeSimResult::WouldSucceed, + "simulate_charge should agree on WouldSucceed" + ); + + // CRITICAL: after the dry-run, storage must still show paused=true + // and pause expiry must still be present. If either changed, the + // estimate path is leaking state writes (a regression from Issue + // 005's shared helper). + let sub_after = client.get_subscription(&user).unwrap(); + assert!( + sub_after.paused, + "estimate call must NOT write auto-resume to storage; sub.paused remained true" + ); + let pause_expiry_after = env.as_contract(&contract_id, || { + storage::get_pause_expiry(&env, &user) + }); + assert!( + pause_expiry_after.is_some(), + "estimate call must NOT clear pause_expiry storage key" + ); +} + +/// Parity: the existing successful charge path is unchanged. +/// We run a full cycle end-to-end and assert funds moved the +/// same way they did before the Issue 005 refactor. +#[test] +fn test_successful_charge_path_unchanged_after_issue_005() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + let token = TokenClient::new(&env, &token_addr); + + let amount: i128 = 5_0000000; + let interval: u64 = 86400; + + client.subscribe(&user, &merchant, &amount, &interval, &token_addr, &None, &None); + + // Both dry-runs should say "not due" immediately. + assert_eq!(client.simulate_charge(&user), ChargeSimResult::NotDue); + let uvec = soroban_sdk::vec![&env, user.clone()]; + assert_eq!( + client.get_batch_charge_estimate(&uvec).get(0).unwrap(), + ChargeResult::Skipped + ); + + let user_before = token.balance(&user); + let merchant_before = token.balance(&merchant); + + env.ledger().with_mut(|l| l.timestamp += interval + 1); + + // Now both dry-runs should say "would charge". + assert_eq!(client.simulate_charge(&user), ChargeSimResult::WouldSucceed); + assert_eq!( + client.get_batch_charge_estimate(&uvec).get(0).unwrap(), + ChargeResult::Charged + ); + + // Live charge should actually move funds. + client.charge(&user); + + assert_eq!(user_before - token.balance(&user), amount); + assert_eq!(token.balance(&merchant) - merchant_before, amount); +} + + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &user); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_transfer_subscription_to_contract_address_panics() { + let (env, contract_id, token_addr, user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); + + client.transfer_subscription(&user, &contract_id); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_subscribe_self_subscription_panics() { + let (env, contract_id, token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &user, + &user, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +} + +#[test] +#[should_panic(expected = "Error(Contract, #32)")] +fn test_subscribe_contract_as_user_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + client.subscribe( + &contract_id, + &merchant, + &1_0000000, + &86400, + &token_addr, + &None, + &None, + ); +// Issue #813: batch_charge stress / resource-envelope coverage +// +// These tests exercise `batch_charge` at the configured max batch size and one +// above it, matching the resource envelope documented for `set_max_batch_size`. +// Soroban's per-invocation budget is finite, so each test resets it to +// unlimited up front (`env.budget().reset_unlimited()`, as the existing +// `test_batch_charge_stress` does) so the setup + one `batch_charge` invocation +// is measured without being throttled by the 200 M default budget. +// +// Approximate resource usage for a max-size batch at the default cap (50): +// - cost(n) ~= 50 x (storage read + fee + token transfer_from + events) +// - at a configured cap of 5 the per-entry cost is identical; only `n` varies. +// The relevant ceiling enforced here is the batch-size check in `batch.rs`, +// which fires *before* any charging, so exceeding the cap panics with +// `ContractError::BatchTooLarge` (#20) rather than executing partial work. + +/// Batch-charge exactly the configured max batch size; all entries succeed. +#[test] +fn test_batch_charge_at_configured_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), batch_limit); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..batch_limit { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the configured max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_above_configured_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + install_admin(&env, &contract_id); + let client = FlowPayClient::new(&env, &contract_id); + + let batch_limit: u32 = 5; + client.set_max_batch_size(&batch_limit); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..=batch_limit { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +/// Batch-charge the default max (50) without explicit configuration succeeds. +#[test] +fn test_batch_charge_at_default_max() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..50 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + let results = client.batch_charge(&users); + assert_eq!(results.len(), 50); + for r in results.into_iter() { + assert_eq!(r, crate::ChargeResult::Charged); + } + for i in 0..50u32 { + let u = users.get(i).unwrap(); + assert!(client.get_subscription(&u).unwrap().active); + } +} + +/// Batch-charge one above the default max panics with BatchTooLarge (#20). +#[test] +#[should_panic(expected = "Error(Contract, #20)")] +fn test_batch_charge_over_default_max_panics() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + env.budget().reset_unlimited(); + let client = FlowPayClient::new(&env, &contract_id); + + let mut users = soroban_sdk::Vec::new(&env); + for _ in 0..51 { + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + users.push_back(u); + } + + env.ledger().with_mut(|l| { + l.timestamp += 86400 + 1; + }); + + client.batch_charge(&users); +} + +// +// Issue #810: authorization-boundary tests +// +// Each admin entrypoint is tested in two states: +// (a) success with admin auth called via the normal client method inside +// `mock_all_auths` +// (b) panic when no admin is set called via try_* so the contract error is +// surfaced as an Err, not a hard panic +// +// Note: `setup()` enables `env.mock_all_auths()`, so a "non-admin rejected" +// variant cannot force `require_admin` to fail in this environment; rejection +// is instead covered by the no-admin panic path and the contract's own +// `require_admin` guard. +// + +// -- freeze_merchant ---------------------------------------------------------- + +/// Admin can freeze a merchant (happy path). +#[test] +fn test_freeze_merchant_admin_success() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.freeze_merchant(&merchant, &None); + + assert!(client.is_merchant_frozen(&merchant)); +} + +/// freeze_merchant panics when no admin has been set. +#[test] +fn test_freeze_merchant_no_admin_panics() { + let (env, contract_id, _token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_freeze_merchant(&merchant, &None); + assert!(result.is_err()); +} + +// -- propose_fee -------------------------------------------------------------- + +/// Admin can propose a fee (happy path). +#[test] +fn test_propose_fee_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + + assert_eq!(client.get_fee(), None); +} + +/// propose_fee panics when no admin has been set. +#[test] +fn test_propose_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let collector = Address::generate(&env); + let result = client.try_propose_fee(&collector, &100); + assert!(result.is_err()); +} + +// -- set_min_interval --------------------------------------------------------- + +/// Admin can set min_interval (happy path). +#[test] +fn test_set_min_interval_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_min_interval(&7200); + assert_eq!(client.get_min_interval(), 7200); +} + +/// set_min_interval panics when no admin has been set. +#[test] +fn test_set_min_interval_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_min_interval(&7200); + assert!(result.is_err()); +} + +// -- batch_cancel ------------------------------------------------------------- + +/// Admin can batch-cancel subscriptions (happy path). +#[test] +fn test_batch_cancel_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_cancel(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(!sub.active); +} + +/// batch_cancel panics when no admin has been set. +#[test] +fn test_batch_cancel_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_cancel(&users); + assert!(result.is_err()); +} + +// -- whitelist_batch_add ------------------------------------------------------ + +/// Admin can batch-add merchants to the whitelist (happy path). +#[test] +fn test_whitelist_batch_add_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let merchants = whitelist_admin_and_merchants(&env, &contract_id, 2); + + let added = client.whitelist_batch_add(&merchants); + assert_eq!(added, 2); +} + +/// whitelist_batch_add panics when no admin has been set. +#[test] +fn test_whitelist_batch_add_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let merchants = soroban_sdk::Vec::new(&env); + let result = client.try_whitelist_batch_add(&merchants); + assert!(result.is_err()); +} + +// -- batch_pause_subscriptions ------------------------------------------------ + +/// Admin can batch-pause subscriptions (happy path). +#[test] +fn test_batch_pause_subscriptions_admin_success() { + let (env, contract_id, token_addr, _user, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let u = subscribe_funded_user(&env, &contract_id, &token_addr, &merchant, 86400); + + let mut users = soroban_sdk::Vec::new(&env); + users.push_back(u.clone()); + + client.batch_pause_subscriptions(&users); + + let sub = client.get_subscription(&u).unwrap(); + assert!(sub.paused); +} + +/// batch_pause_subscriptions panics when no admin has been set. +#[test] +fn test_batch_pause_subscriptions_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_batch_pause_subscriptions(&users); + assert!(result.is_err()); +} + +// -- clear_fee ---------------------------------------------------------------- + +/// Admin can clear fee (happy path). +#[test] +fn test_clear_fee_admin_success() { + let (env, contract_id, _token_addr, user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + env.as_contract(&contract_id, || { + storage::set_admin(&env, &user); + }); + + let collector = Address::generate(&env); + client.propose_fee(&collector, &100); + client.commit_fee(); + assert!(client.get_fee().is_some()); + + client.clear_fee(); + assert_eq!(client.get_fee(), None); +} + +/// clear_fee panics when no admin has been set. +#[test] +fn test_clear_fee_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_clear_fee(); + assert!(result.is_err()); +} + +// -- set_whitelist_enabled ---------------------------------------------------- + +/// Admin can toggle whitelist on/off (happy path). +#[test] +fn test_set_whitelist_enabled_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_whitelist_enabled(&true); + assert!(client.is_whitelist_enabled()); + + client.set_whitelist_enabled(&false); + assert!(!client.is_whitelist_enabled()); +} + +/// set_whitelist_enabled panics when no admin has been set. +#[test] +fn test_set_whitelist_enabled_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_whitelist_enabled(&true); + assert!(result.is_err()); +} + +// -- set_max_batch_size ------------------------------------------------------- + +/// Admin can set max_batch_size (happy path). +#[test] +fn test_set_max_batch_size_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_max_batch_size(&100); + assert_eq!(client.get_max_batch_size(), 100); +} + +/// set_max_batch_size panics when no admin has been set. +#[test] +fn test_set_max_batch_size_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_max_batch_size(&100); + assert!(result.is_err()); +} + +// -- pause_contract ----------------------------------------------------------- + +/// Admin can pause the contract (happy path). +#[test] +fn test_pause_contract_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.pause_contract(); + assert!(client.is_contract_paused()); +} + +/// pause_contract panics when no admin has been set. +#[test] +fn test_pause_contract_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_pause_contract(); + assert!(result.is_err()); +} + +// -- migrate ------------------------------------------------------------------ + +/// Admin can run storage migration (happy path). +#[test] +fn test_migrate_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + client.migrate(&users); + assert_eq!(client.get_schema_version(), 3); +} + +/// migrate panics when no admin has been set. +#[test] +fn test_migrate_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let users = soroban_sdk::Vec::new(&env); + let result = client.try_migrate(&users); + assert!(result.is_err()); +} + +// -- set_global_volume_cap ---------------------------------------------------- + +/// Admin can set the global volume cap (happy path). +#[test] +fn test_set_global_volume_cap_admin_success() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + install_admin(&env, &contract_id); + + client.set_global_volume_cap(&100_0000000); + assert_eq!(client.get_global_volume_cap(), 100_0000000); +} + +/// set_global_volume_cap panics when no admin has been set. +#[test] +fn test_set_global_volume_cap_no_admin_panics() { + let (env, contract_id, _token_addr, _user, _merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let result = client.try_set_global_volume_cap(&100_0000000); + assert!(result.is_err()); +} + + diff --git a/contract/test_snapshots/test/prop_subscribe_interval_respects_min_interval_floor.1.json b/contract/test_snapshots/test/prop_subscribe_interval_respects_min_interval_floor.1.json index 228204f..dce46fe 100644 --- a/contract/test_snapshots/test/prop_subscribe_interval_respects_min_interval_floor.1.json +++ b/contract/test_snapshots/test/prop_subscribe_interval_respects_min_interval_floor.1.json @@ -682,7 +682,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", @@ -1381,7 +1399,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 544730322382084885 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -1396,7 +1414,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 544730322382084885 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -1414,7 +1432,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1301173170172112462 } }, "durability": "temporary" @@ -1429,7 +1447,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1301173170172112462 } }, "durability": "temporary", @@ -1447,7 +1465,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 1345255804540566779 } }, "durability": "temporary" @@ -1462,7 +1480,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 1345255804540566779 } }, "durability": "temporary", @@ -1480,7 +1498,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1345255804540566779 + "nonce": 1501277168746644712 } }, "durability": "temporary" @@ -1495,7 +1513,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1345255804540566779 + "nonce": 1501277168746644712 } }, "durability": "temporary", @@ -1513,7 +1531,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1506441561184340186 + "nonce": 1768924605727919950 } }, "durability": "temporary" @@ -1528,7 +1546,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1506441561184340186 + "nonce": 1768924605727919950 } }, "durability": "temporary", @@ -1546,7 +1564,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2623024502929126324 + "nonce": 1967922937664261543 } }, "durability": "temporary" @@ -1561,7 +1579,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2623024502929126324 + "nonce": 1967922937664261543 } }, "durability": "temporary", @@ -1579,7 +1597,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2781962168096793370 + "nonce": 2254425974100219774 } }, "durability": "temporary" @@ -1594,7 +1612,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2781962168096793370 + "nonce": 2254425974100219774 } }, "durability": "temporary", @@ -1612,7 +1630,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3507645618223554847 + "nonce": 2260266285686479847 } }, "durability": "temporary" @@ -1627,7 +1645,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3507645618223554847 + "nonce": 2260266285686479847 } }, "durability": "temporary", @@ -1645,7 +1663,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3736142932239307322 + "nonce": 2781962168096793370 } }, "durability": "temporary" @@ -1660,7 +1678,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3736142932239307322 + "nonce": 2781962168096793370 } }, "durability": "temporary", @@ -1678,7 +1696,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3791811173315715839 + "nonce": 3736142932239307322 } }, "durability": "temporary" @@ -1693,7 +1711,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 3791811173315715839 + "nonce": 3736142932239307322 } }, "durability": "temporary", @@ -1777,7 +1795,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5219976416919672547 + "nonce": 5541220902715666415 } }, "durability": "temporary" @@ -1792,7 +1810,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5219976416919672547 + "nonce": 5541220902715666415 } }, "durability": "temporary", @@ -1810,7 +1828,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 5994256439390011320 } }, "durability": "temporary" @@ -1825,7 +1843,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 5994256439390011320 } }, "durability": "temporary", @@ -1843,7 +1861,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 6054449652355741849 + "nonce": 7935298921545310989 } }, "durability": "temporary" @@ -1858,7 +1876,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 6054449652355741849 + "nonce": 7935298921545310989 } }, "durability": "temporary", @@ -1909,7 +1927,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 8840537117088365198 + "nonce": 8799288422285703394 } }, "durability": "temporary" @@ -1924,7 +1942,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 8840537117088365198 + "nonce": 8799288422285703394 } }, "durability": "temporary", @@ -4459,6 +4477,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -4498,7 +4549,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", "key": { "ledger_key_nonce": { - "nonce": 5994256439390011320 + "nonce": 4914054227674050081 } }, "durability": "temporary" @@ -4513,7 +4564,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", "key": { "ledger_key_nonce": { - "nonce": 5994256439390011320 + "nonce": 4914054227674050081 } }, "durability": "temporary", @@ -4531,7 +4582,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", "key": { "ledger_key_nonce": { - "nonce": 2254425974100219774 + "nonce": 6369051681840606601 } }, "durability": "temporary" @@ -4546,7 +4597,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", "key": { "ledger_key_nonce": { - "nonce": 2254425974100219774 + "nonce": 6369051681840606601 } }, "durability": "temporary", @@ -4564,7 +4615,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", "key": { "ledger_key_nonce": { - "nonce": 1501277168746644712 + "nonce": 649072984189975589 } }, "durability": "temporary" @@ -4579,7 +4630,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", "key": { "ledger_key_nonce": { - "nonce": 1501277168746644712 + "nonce": 649072984189975589 } }, "durability": "temporary", @@ -4597,7 +4648,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", "key": { "ledger_key_nonce": { - "nonce": 1967922937664261543 + "nonce": 9219847003023114248 } }, "durability": "temporary" @@ -4612,7 +4663,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", "key": { "ledger_key_nonce": { - "nonce": 1967922937664261543 + "nonce": 9219847003023114248 } }, "durability": "temporary", @@ -4630,7 +4681,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", "key": { "ledger_key_nonce": { - "nonce": 7564072809757355283 + "nonce": 3791811173315715839 } }, "durability": "temporary" @@ -4645,7 +4696,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", "key": { "ledger_key_nonce": { - "nonce": 7564072809757355283 + "nonce": 3791811173315715839 } }, "durability": "temporary", @@ -4663,7 +4714,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", "key": { "ledger_key_nonce": { - "nonce": 8799288422285703394 + "nonce": 7564072809757355283 } }, "durability": "temporary" @@ -4678,7 +4729,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", "key": { "ledger_key_nonce": { - "nonce": 8799288422285703394 + "nonce": 7564072809757355283 } }, "durability": "temporary", @@ -4696,7 +4747,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", "key": { "ledger_key_nonce": { - "nonce": 1768924605727919950 + "nonce": 4822409645871993625 } }, "durability": "temporary" @@ -4711,7 +4762,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", "key": { "ledger_key_nonce": { - "nonce": 1768924605727919950 + "nonce": 4822409645871993625 } }, "durability": "temporary", @@ -4729,7 +4780,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", "key": { "ledger_key_nonce": { - "nonce": 4822409645871993625 + "nonce": 6054449652355741849 } }, "durability": "temporary" @@ -4744,7 +4795,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", "key": { "ledger_key_nonce": { - "nonce": 4822409645871993625 + "nonce": 6054449652355741849 } }, "durability": "temporary", @@ -4795,7 +4846,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", "key": { "ledger_key_nonce": { - "nonce": 7935298921545310989 + "nonce": 5219976416919672547 } }, "durability": "temporary" @@ -4810,7 +4861,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", "key": { "ledger_key_nonce": { - "nonce": 7935298921545310989 + "nonce": 5219976416919672547 } }, "durability": "temporary", @@ -4828,7 +4879,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", "key": { "ledger_key_nonce": { - "nonce": 2260266285686479847 + "nonce": 2917827370713594154 } }, "durability": "temporary" @@ -4843,7 +4894,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", "key": { "ledger_key_nonce": { - "nonce": 2260266285686479847 + "nonce": 2917827370713594154 } }, "durability": "temporary", @@ -4861,7 +4912,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", "key": { "ledger_key_nonce": { - "nonce": 2917827370713594154 + "nonce": 8067048471933141837 } }, "durability": "temporary" @@ -4876,7 +4927,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", "key": { "ledger_key_nonce": { - "nonce": 2917827370713594154 + "nonce": 8067048471933141837 } }, "durability": "temporary", diff --git a/contract/test_snapshots/test/test_accept_admin_without_proposal_panics.1.json b/contract/test_snapshots/test/test_accept_admin_without_proposal_panics.1.json index e117e8d..89a0285 100644 --- a/contract/test_snapshots/test/test_accept_admin_without_proposal_panics.1.json +++ b/contract/test_snapshots/test/test_accept_admin_without_proposal_panics.1.json @@ -1014,4 +1014,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_count_decrements_on_cancel.1.json b/contract/test_snapshots/test/test_active_count_decrements_on_cancel.1.json index 78b118a..9bf7781 100644 --- a/contract/test_snapshots/test/test_active_count_decrements_on_cancel.1.json +++ b/contract/test_snapshots/test/test_active_count_decrements_on_cancel.1.json @@ -1816,4 +1816,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_count_does_not_double_count_on_resubscribe.1.json b/contract/test_snapshots/test/test_active_count_does_not_double_count_on_resubscribe.1.json index 345b709..3ea6f2e 100644 --- a/contract/test_snapshots/test/test_active_count_does_not_double_count_on_resubscribe.1.json +++ b/contract/test_snapshots/test/test_active_count_does_not_double_count_on_resubscribe.1.json @@ -2215,4 +2215,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_count_increments_on_subscribe.1.json b/contract/test_snapshots/test/test_active_count_increments_on_subscribe.1.json index 0a43d59..8d25ed4 100644 --- a/contract/test_snapshots/test/test_active_count_increments_on_subscribe.1.json +++ b/contract/test_snapshots/test/test_active_count_increments_on_subscribe.1.json @@ -1685,4 +1685,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_count_multiple_users.1.json b/contract/test_snapshots/test/test_active_count_multiple_users.1.json index 1eb690d..c3e5fc1 100644 --- a/contract/test_snapshots/test/test_active_count_multiple_users.1.json +++ b/contract/test_snapshots/test/test_active_count_multiple_users.1.json @@ -2781,4 +2781,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_all_cancelled_returns_empty.1.json b/contract/test_snapshots/test/test_active_subscriber_page_all_cancelled_returns_empty.1.json new file mode 100644 index 0000000..09f94fd --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_all_cancelled_returns_empty.1.json @@ -0,0 +1,4457 @@ +{ + "generators": { + "address": 8, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 50 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_alternating_active_cancelled.1.json b/contract/test_snapshots/test/test_active_subscriber_page_alternating_active_cancelled.1.json new file mode 100644 index 0000000..3f254ad --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_alternating_active_cancelled.1.json @@ -0,0 +1,7234 @@ +{ + "generators": { + "address": 11, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 4 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 50 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_bounded_scan_with_sparse_index.1.json b/contract/test_snapshots/test/test_active_subscriber_page_bounded_scan_with_sparse_index.1.json new file mode 100644 index 0000000..b04dc24 --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_bounded_scan_with_sparse_index.1.json @@ -0,0 +1,12059 @@ +{ + "generators": { + "address": 15, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "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": 4914054227674050081 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 10 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 9 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 5 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 5 + }, + { + "u32": 5 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_keeper_iteration_terminates.1.json b/contract/test_snapshots/test/test_active_subscriber_page_keeper_iteration_terminates.1.json new file mode 100644 index 0000000..2a3f645 --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_keeper_iteration_terminates.1.json @@ -0,0 +1,9471 @@ +{ + "generators": { + "address": 13, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 8 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 7 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 3 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 6 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 9 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_limit_capped_at_50.1.json b/contract/test_snapshots/test/test_active_subscriber_page_limit_capped_at_50.1.json new file mode 100644 index 0000000..41da33a --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_limit_capped_at_50.1.json @@ -0,0 +1,6010 @@ +{ + "generators": { + "address": 10, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_no_tombstones_covers_all.1.json b/contract/test_snapshots/test/test_active_subscriber_page_no_tombstones_covers_all.1.json new file mode 100644 index 0000000..218926b --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_no_tombstones_covers_all.1.json @@ -0,0 +1,6125 @@ +{ + "generators": { + "address": 10, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 3 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 5 + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_offset_beyond_count_returns_empty.1.json b/contract/test_snapshots/test/test_active_subscriber_page_offset_beyond_count_returns_empty.1.json new file mode 100644 index 0000000..395de90 --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_offset_beyond_count_returns_empty.1.json @@ -0,0 +1,4064 @@ +{ + "generators": { + "address": 8, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 100 + }, + { + "u32": 10 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_only_last_active.1.json b/contract/test_snapshots/test/test_active_subscriber_page_only_last_active.1.json new file mode 100644 index 0000000..54c77bf --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_only_last_active.1.json @@ -0,0 +1,12002 @@ +{ + "generators": { + "address": 15, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "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": 4914054227674050081 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 10 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 9 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 50 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_resubscribe_after_cancel.1.json b/contract/test_snapshots/test/test_active_subscriber_page_resubscribe_after_cancel.1.json new file mode 100644 index 0000000..83953f0 --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_resubscribe_after_cancel.1.json @@ -0,0 +1,2710 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscriber_count" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscriber_count" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscriber_count" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscriber_count" + } + ], + "data": { + "u64": 2 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 50 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_with_tombstones_covers_all.1.json b/contract/test_snapshots/test/test_active_subscriber_page_with_tombstones_covers_all.1.json new file mode 100644 index 0000000..0484ef0 --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_with_tombstones_covers_all.1.json @@ -0,0 +1,7535 @@ +{ + "generators": { + "address": 11, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "cancel", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "cancel" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "cancel" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 4 + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 6 + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_active_subscriber_page_zero_limit_returns_empty.1.json b/contract/test_snapshots/test/test_active_subscriber_page_zero_limit_returns_empty.1.json new file mode 100644 index 0000000..93d3f8e --- /dev/null +++ b/contract/test_snapshots/test/test_active_subscriber_page_zero_limit_returns_empty.1.json @@ -0,0 +1,4064 @@ +{ + "generators": { + "address": 8, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": { + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200 + } + } + ] + } + } + }, + "ext": "v0" + }, + 201 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_active_subscriber_page" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_admin_batch_cancel_subscriptions_cancels_multiple_accounts.1.json b/contract/test_snapshots/test/test_admin_batch_cancel_subscriptions_cancels_multiple_accounts.1.json index 010c1e2..cf74040 100644 --- a/contract/test_snapshots/test/test_admin_batch_cancel_subscriptions_cancels_multiple_accounts.1.json +++ b/contract/test_snapshots/test/test_admin_batch_cancel_subscriptions_cancels_multiple_accounts.1.json @@ -3041,4 +3041,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_admin_batch_pause_subscriptions_freezes_multiple_accounts.1.json b/contract/test_snapshots/test/test_admin_batch_pause_subscriptions_freezes_multiple_accounts.1.json index a58d671..01d73a0 100644 --- a/contract/test_snapshots/test/test_admin_batch_pause_subscriptions_freezes_multiple_accounts.1.json +++ b/contract/test_snapshots/test/test_admin_batch_pause_subscriptions_freezes_multiple_accounts.1.json @@ -3002,4 +3002,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_cancel_admin_success.1.json b/contract/test_snapshots/test/test_batch_cancel_admin_success.1.json new file mode 100644 index 0000000..0fc5ef0 --- /dev/null +++ b/contract/test_snapshots/test/test_batch_cancel_admin_success.1.json @@ -0,0 +1,2379 @@ +{ + "generators": { + "address": 7, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "batch_cancel", + "args": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexRemoved" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_cancel" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "cancelled" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "batch_cancel" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_cancel_exceeds_max_size_panics.1.json b/contract/test_snapshots/test/test_batch_cancel_exceeds_max_size_panics.1.json index 704a2ea..80dcd18 100644 --- a/contract/test_snapshots/test/test_batch_cancel_exceeds_max_size_panics.1.json +++ b/contract/test_snapshots/test/test_batch_cancel_exceeds_max_size_panics.1.json @@ -1228,4 +1228,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_cancel_handles_mixed_states_and_clears_referral.1.json b/contract/test_snapshots/test/test_batch_cancel_handles_mixed_states_and_clears_referral.1.json index ca87988..e7eaf00 100644 --- a/contract/test_snapshots/test/test_batch_cancel_handles_mixed_states_and_clears_referral.1.json +++ b/contract/test_snapshots/test/test_batch_cancel_handles_mixed_states_and_clears_referral.1.json @@ -773,7 +773,6 @@ }, "ext": "v0" }, - 4095, 6307200 ] ], @@ -4936,4 +4935,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_cancel_no_admin_panics.1.json b/contract/test_snapshots/test/test_batch_cancel_no_admin_panics.1.json new file mode 100644 index 0000000..a15c10b --- /dev/null +++ b/contract/test_snapshots/test/test_batch_cancel_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_cancel" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#221)'" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "batch_cancel" + }, + { + "vec": [ + { + "vec": [] + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_cancel_requires_admin_auth.1.json b/contract/test_snapshots/test/test_batch_cancel_requires_admin_auth.1.json index 414dae8..c7fab78 100644 --- a/contract/test_snapshots/test/test_batch_cancel_requires_admin_auth.1.json +++ b/contract/test_snapshots/test/test_batch_cancel_requires_admin_auth.1.json @@ -3,7 +3,10 @@ "address": 3, "nonce": 0 }, - "auth": [[], []], + "auth": [ + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -264,4 +267,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_above_configured_max_panics.1.json b/contract/test_snapshots/test/test_batch_charge_above_configured_max_panics.1.json new file mode 100644 index 0000000..e828b0b --- /dev/null +++ b/contract/test_snapshots/test/test_batch_charge_above_configured_max_panics.1.json @@ -0,0 +1,7237 @@ +{ + "generators": { + "address": 12, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_max_batch_size", + "args": [ + { + "u32": 5 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 86401, + "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": 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" + }, + 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": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 6 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxBatchSize" + } + ] + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "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": "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" + }, + 6311999 + ] + ], + [ + { + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": { + "u32": 5 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 20 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "batch_charge" + }, + { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_all_charged_emits_no_skips_summary.1.json b/contract/test_snapshots/test/test_batch_charge_all_charged_emits_no_skips_summary.1.json index 39fa120..6d5d524 100644 --- a/contract/test_snapshots/test/test_batch_charge_all_charged_emits_no_skips_summary.1.json +++ b/contract/test_snapshots/test/test_batch_charge_all_charged_emits_no_skips_summary.1.json @@ -4111,4 +4111,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_allowance_checked_against_gross_not_net.1.json b/contract/test_snapshots/test/test_batch_charge_allowance_checked_against_gross_not_net.1.json index d025a0d..880f743 100644 --- a/contract/test_snapshots/test/test_batch_charge_allowance_checked_against_gross_not_net.1.json +++ b/contract/test_snapshots/test/test_batch_charge_allowance_checked_against_gross_not_net.1.json @@ -2368,4 +2368,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_allowance_insufficient_counted_in_skips_summary.1.json b/contract/test_snapshots/test/test_batch_charge_allowance_insufficient_counted_in_skips_summary.1.json index 0583150..383ce78 100644 --- a/contract/test_snapshots/test/test_batch_charge_allowance_insufficient_counted_in_skips_summary.1.json +++ b/contract/test_snapshots/test/test_batch_charge_allowance_insufficient_counted_in_skips_summary.1.json @@ -4080,4 +4080,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_at_configured_max.1.json b/contract/test_snapshots/test/test_batch_charge_at_configured_max.1.json new file mode 100644 index 0000000..980a1f3 --- /dev/null +++ b/contract/test_snapshots/test/test_batch_charge_at_configured_max.1.json @@ -0,0 +1,8910 @@ +{ + "generators": { + "address": 11, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_max_batch_size", + "args": [ + { + "u32": 5 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 86401, + "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": 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" + }, + 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": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 50000000 + } + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDay" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDay" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 50000000 + } + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDayIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDayIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalVolumeWindow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "accumulated_volume" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50000000 + } + } + }, + { + "key": { + "symbol": "current_window_start" + }, + "val": { + "u64": 86401 + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxBatchSize" + } + ] + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "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": "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" + }, + 6311999 + ] + ], + [ + { + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 50000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": { + "u32": 5 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_at_default_max.1.json b/contract/test_snapshots/test/test_batch_charge_at_default_max.1.json new file mode 100644 index 0000000..611c9ad --- /dev/null +++ b/contract/test_snapshots/test/test_batch_charge_at_default_max.1.json @@ -0,0 +1,74666 @@ +{ + "generators": { + "address": 55, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 86401, + "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": 76060705166808367 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 76060705166808367 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 138281095211012601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 138281095211012601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 395965415359800683 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 395965415359800683 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 481950710878307615 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 481950710878307615 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 825643724043790813 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 825643724043790813 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1060519300191340491 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1060519300191340491 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1296074968468804349 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1296074968468804349 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1852713134505651269 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1852713134505651269 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2059145518884188347 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2059145518884188347 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2240353334540944866 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2240353334540944866 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2526474023416127439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2526474023416127439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2733761617737370087 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2733761617737370087 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2917827370713594154 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2917827370713594154 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3195544978474815821 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3195544978474815821 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3313549020784837764 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3313549020784837764 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3554315858714444830 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3554315858714444830 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3774568110897464881 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3774568110897464881 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3888397324562915271 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3888397324562915271 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3972104438082304464 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3972104438082304464 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4430446381624030419 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4430446381624030419 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4822409645871993625 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4822409645871993625 + } + }, + "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": 4900321175033996277 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4900321175033996277 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4953178291310646268 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4953178291310646268 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5322562311059672449 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5322562311059672449 + } + }, + "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": 5722529731741582957 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5722529731741582957 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6233550795020492710 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6233550795020492710 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6306546209684867670 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6306546209684867670 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7542511690552384870 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7542511690552384870 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7564072809757355283 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7564072809757355283 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7843123319620927794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7843123319620927794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8079234564129527112 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8079234564129527112 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8157382300544000078 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8157382300544000078 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8670922849427152164 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8670922849427152164 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8803234444111318169 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8803234444111318169 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8927585635974722530 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8927585635974722530 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9179355488868059351 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9179355488868059351 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9203650180228785090 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9203650180228785090 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ChargeHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 86401 + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500000000 + } + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDay" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDay" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500000000 + } + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDayIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueDayIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantRevenueHistory" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 50 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 11 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 11 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 12 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 12 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 13 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 13 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 14 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 14 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 15 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 15 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 16 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 16 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 17 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 17 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 18 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 18 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 19 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 19 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 21 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 21 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 22 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 22 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 23 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 23 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 24 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 24 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 25 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 25 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 26 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 26 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 27 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 27 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 28 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 28 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 29 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 29 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 30 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 30 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 31 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 31 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 32 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 32 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 33 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 33 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 34 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 34 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 35 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 35 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 36 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 36 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 37 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 37 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 38 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 38 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 39 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 39 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 40 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 40 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 41 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 41 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 43 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 43 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 44 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 44 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 45 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 45 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 46 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 46 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 47 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 47 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 48 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 48 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 49 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 49 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 50 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 7 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 8 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 9 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 10 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 11 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 12 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 13 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 14 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 15 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 16 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 17 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 18 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 19 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 20 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 21 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 22 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 23 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 24 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 25 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 26 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 27 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 28 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 29 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 30 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 31 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 32 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 33 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 34 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 35 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 36 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 37 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 38 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 39 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 40 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 41 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 42 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 43 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 44 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 45 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 46 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 47 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 48 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 49 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 50 + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalVolumeWindow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "accumulated_volume" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500000000 + } + } + }, + { + "key": { + "symbol": "current_window_start" + }, + "val": { + "u64": 86401 + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 1768924605727919950 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 1768924605727919950 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 3791811173315715839 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 3791811173315715839 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 6054449652355741849 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 6054449652355741849 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 7935298921545310989 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 7935298921545310989 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 2260266285686479847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 2260266285686479847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 5219976416919672547 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 5219976416919672547 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8067048471933141837 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8067048471933141837 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8582780626144801259 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8582780626144801259 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 875319255151014454 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 875319255151014454 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 4211405827341991149 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 4211405827341991149 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 1161004259517476189 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 1161004259517476189 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 5043854608229809201 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 5043854608229809201 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 1614739035918781831 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 1614739035918781831 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 4271701834903804982 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 4271701834903804982 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 670404547506884812 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 670404547506884812 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 7687354978218273323 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 7687354978218273323 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 3945433670868351223 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 3945433670868351223 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 6875503646996515520 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 6875503646996515520 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 300033532921919907 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 300033532921919907 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 1273663306374918439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 1273663306374918439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4601299207353310938 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4601299207353310938 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4677765900193036446 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4677765900193036446 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5536345977105687142 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5536345977105687142 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5670621023751100817 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5670621023751100817 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6006104520346379553 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6006104520346379553 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6208800374416201873 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6208800374416201873 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 124590656928745377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 124590656928745377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 8941506213304483187 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 8941506213304483187 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 3312139281147456071 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 3312139281147456071 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 8754220119846337199 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 8754220119846337199 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 2841415490237507697 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 2841415490237507697 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 5148037999226383026 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 5148037999226383026 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 1242168959743744263 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 1242168959743744263 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 4553542552662768400 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 4553542552662768400 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 767083961780241525 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 767083961780241525 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 6310153727739411520 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 6310153727739411520 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 394263859078419540 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 394263859078419540 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 1166692687884080826 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 1166692687884080826 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 7462478058564425762 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 7462478058564425762 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 9085653633391546739 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 9085653633391546739 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 5567623040284808000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 5567623040284808000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 7542349592066956260 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 7542349592066956260 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 354189697570339794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 354189697570339794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 1427764051160478586 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 1427764051160478586 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 1890705647580152636 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 1890705647580152636 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 5929428834697765953 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 5929428834697765953 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 3292169524723964477 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 3292169524723964477 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 6162416380643872607 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 6162416380643872607 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 8886531160246778710 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 8886531160246778710 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 9168604641596501804 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 9168604641596501804 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 878113941924154464 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 878113941924154464 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 7603161247662026985 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 7603161247662026985 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 1022041161511539345 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 1022041161511539345 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 6962827370825955938 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 6962827370825955938 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 5214782575861413720 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 5214782575861413720 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 6536393324450770693 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 6536393324450770693 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 2337338159406607218 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 2337338159406607218 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 7989749295507198727 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 7989749295507198727 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 1795696960866358347 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 1795696960866358347 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 2132013547778639677 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 2132013547778639677 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 3692835619527640791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 3692835619527640791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 4183239946648934021 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 4183239946648934021 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7053573266638440948 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7053573266638440948 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7146456229595295753 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7146456229595295753 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 725138602857225060 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 725138602857225060 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 4871800790448612197 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 4871800790448612197 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 5731709686649193738 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 5731709686649193738 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 7300235145643751250 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 7300235145643751250 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 7221074154173408343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 7221074154173408343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 8727160423468316038 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 8727160423468316038 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 3095084508008659227 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 3095084508008659227 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 4574976570823973688 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 4574976570823973688 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 3115594559043080832 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 3115594559043080832 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 9008986787791471439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 9008986787791471439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 500000000 + } + } + }, + { + "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": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 99990000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer_from" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer_from" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "charged" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charged_at" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "fee" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "gross" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "net" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + }, + { + "vec": [ + { + "symbol": "Charged" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 86401 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_auto_resume_with_insufficient_allowance.1.json b/contract/test_snapshots/test/test_batch_charge_auto_resume_with_insufficient_allowance.1.json index 6ec1ed3..645cbbc 100644 --- a/contract/test_snapshots/test/test_batch_charge_auto_resume_with_insufficient_allowance.1.json +++ b/contract/test_snapshots/test/test_batch_charge_auto_resume_with_insufficient_allowance.1.json @@ -2472,4 +2472,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_charged_and_skipped.1.json b/contract/test_snapshots/test/test_batch_charge_charged_and_skipped.1.json index e1563c5..bd7ba7d 100644 --- a/contract/test_snapshots/test/test_batch_charge_charged_and_skipped.1.json +++ b/contract/test_snapshots/test/test_batch_charge_charged_and_skipped.1.json @@ -3532,4 +3532,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_emits_skips_summary_with_counts.1.json b/contract/test_snapshots/test/test_batch_charge_emits_skips_summary_with_counts.1.json index 38dc4aa..815a2dc 100644 --- a/contract/test_snapshots/test/test_batch_charge_emits_skips_summary_with_counts.1.json +++ b/contract/test_snapshots/test/test_batch_charge_emits_skips_summary_with_counts.1.json @@ -6368,4 +6368,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_empty.1.json b/contract/test_snapshots/test/test_batch_charge_empty.1.json index ce973fd..a57b7f0 100644 --- a/contract/test_snapshots/test/test_batch_charge_empty.1.json +++ b/contract/test_snapshots/test/test_batch_charge_empty.1.json @@ -934,4 +934,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_estimate.1.json b/contract/test_snapshots/test/test_batch_charge_estimate.1.json index 53d388a..bbb5c79 100644 --- a/contract/test_snapshots/test/test_batch_charge_estimate.1.json +++ b/contract/test_snapshots/test/test_batch_charge_estimate.1.json @@ -1079,4 +1079,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_estimate_reflects_allowance_insufficient.1.json b/contract/test_snapshots/test/test_batch_charge_estimate_reflects_allowance_insufficient.1.json index b8a61ba..c07f8fb 100644 --- a/contract/test_snapshots/test/test_batch_charge_estimate_reflects_allowance_insufficient.1.json +++ b/contract/test_snapshots/test/test_batch_charge_estimate_reflects_allowance_insufficient.1.json @@ -1876,4 +1876,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_exact_allowance_succeeds.1.json b/contract/test_snapshots/test/test_batch_charge_exact_allowance_succeeds.1.json index f9a2bf3..516649a 100644 --- a/contract/test_snapshots/test/test_batch_charge_exact_allowance_succeeds.1.json +++ b/contract/test_snapshots/test/test_batch_charge_exact_allowance_succeeds.1.json @@ -2521,4 +2521,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_grace_period_elapsed.1.json b/contract/test_snapshots/test/test_batch_charge_grace_period_elapsed.1.json index 6545110..acbb3dc 100644 --- a/contract/test_snapshots/test/test_batch_charge_grace_period_elapsed.1.json +++ b/contract/test_snapshots/test/test_batch_charge_grace_period_elapsed.1.json @@ -2001,4 +2001,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_healthy_before_and_after_insufficient.1.json b/contract/test_snapshots/test/test_batch_charge_healthy_before_and_after_insufficient.1.json index 2ab6637..fdf3d3d 100644 --- a/contract/test_snapshots/test/test_batch_charge_healthy_before_and_after_insufficient.1.json +++ b/contract/test_snapshots/test/test_batch_charge_healthy_before_and_after_insufficient.1.json @@ -5403,4 +5403,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_inactive.1.json b/contract/test_snapshots/test/test_batch_charge_inactive.1.json index e7c192d..c506b1a 100644 --- a/contract/test_snapshots/test/test_batch_charge_inactive.1.json +++ b/contract/test_snapshots/test/test_batch_charge_inactive.1.json @@ -1875,4 +1875,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_mixed_allowance_does_not_abort_healthy_users.1.json b/contract/test_snapshots/test/test_batch_charge_mixed_allowance_does_not_abort_healthy_users.1.json index a9aff3f..5f4a6e0 100644 --- a/contract/test_snapshots/test/test_batch_charge_mixed_allowance_does_not_abort_healthy_users.1.json +++ b/contract/test_snapshots/test/test_batch_charge_mixed_allowance_does_not_abort_healthy_users.1.json @@ -5509,4 +5509,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_multiple_insufficient_allowances.1.json b/contract/test_snapshots/test/test_batch_charge_multiple_insufficient_allowances.1.json index 8ec374d..bea88b4 100644 --- a/contract/test_snapshots/test/test_batch_charge_multiple_insufficient_allowances.1.json +++ b/contract/test_snapshots/test/test_batch_charge_multiple_insufficient_allowances.1.json @@ -3547,4 +3547,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_no_subscription.1.json b/contract/test_snapshots/test/test_batch_charge_no_subscription.1.json index 0ef6026..2b6a732 100644 --- a/contract/test_snapshots/test/test_batch_charge_no_subscription.1.json +++ b/contract/test_snapshots/test/test_batch_charge_no_subscription.1.json @@ -1039,4 +1039,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_not_due_only_emits_no_skips_summary.1.json b/contract/test_snapshots/test/test_batch_charge_not_due_only_emits_no_skips_summary.1.json index 956746a..e51324e 100644 --- a/contract/test_snapshots/test/test_batch_charge_not_due_only_emits_no_skips_summary.1.json +++ b/contract/test_snapshots/test/test_batch_charge_not_due_only_emits_no_skips_summary.1.json @@ -3111,4 +3111,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_one_below_allowance_returns_allowance_insufficient.1.json b/contract/test_snapshots/test/test_batch_charge_one_below_allowance_returns_allowance_insufficient.1.json index cf66f46..300199a 100644 --- a/contract/test_snapshots/test/test_batch_charge_one_below_allowance_returns_allowance_insufficient.1.json +++ b/contract/test_snapshots/test/test_batch_charge_one_below_allowance_returns_allowance_insufficient.1.json @@ -2181,4 +2181,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_ordering.1.json b/contract/test_snapshots/test/test_batch_charge_ordering.1.json index ec8a706..b803d5e 100644 --- a/contract/test_snapshots/test/test_batch_charge_ordering.1.json +++ b/contract/test_snapshots/test/test_batch_charge_ordering.1.json @@ -4704,4 +4704,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_over_default_max_panics.1.json b/contract/test_snapshots/test/test_batch_charge_over_default_max_panics.1.json new file mode 100644 index 0000000..d5fb628 --- /dev/null +++ b/contract/test_snapshots/test/test_batch_charge_over_default_max_panics.1.json @@ -0,0 +1,50808 @@ +{ + "generators": { + "address": 56, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 86401, + "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": 76060705166808367 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 76060705166808367 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 138281095211012601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 138281095211012601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 395965415359800683 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 395965415359800683 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 481950710878307615 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 481950710878307615 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 649072984189975589 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 825643724043790813 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 825643724043790813 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1060519300191340491 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1060519300191340491 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1222507307267348763 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1222507307267348763 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1296074968468804349 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1296074968468804349 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1345255804540566779 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1690253666352074432 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1852713134505651269 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1852713134505651269 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2059145518884188347 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2059145518884188347 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2240353334540944866 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2240353334540944866 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2526474023416127439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2526474023416127439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2733761617737370087 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2733761617737370087 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2917827370713594154 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2917827370713594154 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3195544978474815821 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3195544978474815821 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3313549020784837764 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3313549020784837764 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3554315858714444830 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3554315858714444830 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3736142932239307322 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3774568110897464881 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3774568110897464881 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3888397324562915271 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3888397324562915271 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3972104438082304464 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 3972104438082304464 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4430446381624030419 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4430446381624030419 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4571470874178140630 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4822409645871993625 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4822409645871993625 + } + }, + "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": 4900321175033996277 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4900321175033996277 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4914054227674050081 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4953178291310646268 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4953178291310646268 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5322562311059672449 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5322562311059672449 + } + }, + "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": 5722529731741582957 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5722529731741582957 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6233550795020492710 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6233550795020492710 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6306546209684867670 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6306546209684867670 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6369051681840606601 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7542511690552384870 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7542511690552384870 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7564072809757355283 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7564072809757355283 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7843123319620927794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7843123319620927794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8079234564129527112 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8079234564129527112 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8157382300544000078 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8157382300544000078 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8670922849427152164 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8670922849427152164 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8803234444111318169 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8803234444111318169 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8927585635974722530 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8927585635974722530 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9179355488868059351 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9179355488868059351 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9203650180228785090 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9203650180228785090 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 9219847003023114248 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 51 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 4 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 6 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 7 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 8 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 9 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 11 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 11 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 12 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 12 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 13 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 13 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 14 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 14 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 15 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 15 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 16 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 16 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 17 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 17 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 18 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 18 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 19 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 19 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 21 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 21 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 22 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 22 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 23 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 23 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 24 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 24 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 25 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 25 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 26 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 26 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 27 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 27 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 28 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 28 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 29 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 29 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 30 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 30 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 31 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 31 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 32 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 32 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 33 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 33 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 34 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 34 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 35 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 35 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 36 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 36 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 37 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 37 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 38 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 38 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 39 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 39 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 40 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 40 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 41 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 41 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 43 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 43 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 44 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 44 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 45 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 45 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 46 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 46 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 47 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 47 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 48 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 48 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 49 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 49 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 50 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 50 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 51 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 3 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 4 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 5 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 6 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 7 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 8 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 9 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 10 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 11 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 12 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 13 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 14 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 15 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 16 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 17 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 18 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 19 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 20 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 21 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 22 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 23 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 24 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 25 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 26 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 27 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 28 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 29 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 30 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 31 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 32 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 33 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 34 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 35 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 36 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 37 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 38 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 39 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 40 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 41 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 42 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 43 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 44 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 45 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 46 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 47 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 48 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 49 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 50 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 51 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "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" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 6391496069076573377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2140788761963629343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N", + "key": { + "ledger_key_nonce": { + "nonce": 2578412842719982537 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 5012940724606903311 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5", + "key": { + "ledger_key_nonce": { + "nonce": 8077058277077262192 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 2891388370666955040 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN", + "key": { + "ledger_key_nonce": { + "nonce": 8375915698557174338 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 544730322382084885 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5", + "key": { + "ledger_key_nonce": { + "nonce": 5994256439390011320 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 1506441561184340186 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N", + "key": { + "ledger_key_nonce": { + "nonce": 2254425974100219774 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 1501277168746644712 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO", + "key": { + "ledger_key_nonce": { + "nonce": 2623024502929126324 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 1967922937664261543 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6", + "key": { + "ledger_key_nonce": { + "nonce": 3507645618223554847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8799288422285703394 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O", + "key": { + "ledger_key_nonce": { + "nonce": 8840537117088365198 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 1768924605727919950 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 1768924605727919950 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 3791811173315715839 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6", + "key": { + "ledger_key_nonce": { + "nonce": 3791811173315715839 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 6054449652355741849 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 6054449652355741849 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 7935298921545310989 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO", + "key": { + "ledger_key_nonce": { + "nonce": 7935298921545310989 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 2260266285686479847 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 2260266285686479847 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 5219976416919672547 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6", + "key": { + "ledger_key_nonce": { + "nonce": 5219976416919672547 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8067048471933141837 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8067048471933141837 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8582780626144801259 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO", + "key": { + "ledger_key_nonce": { + "nonce": 8582780626144801259 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 875319255151014454 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 875319255151014454 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 4211405827341991149 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6", + "key": { + "ledger_key_nonce": { + "nonce": 4211405827341991149 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 1161004259517476189 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 1161004259517476189 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 5043854608229809201 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP", + "key": { + "ledger_key_nonce": { + "nonce": 5043854608229809201 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 1614739035918781831 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 1614739035918781831 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 4271701834903804982 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7", + "key": { + "ledger_key_nonce": { + "nonce": 4271701834903804982 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 670404547506884812 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 670404547506884812 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 7687354978218273323 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P", + "key": { + "ledger_key_nonce": { + "nonce": 7687354978218273323 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 3945433670868351223 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 3945433670868351223 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 6875503646996515520 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7", + "key": { + "ledger_key_nonce": { + "nonce": 6875503646996515520 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 300033532921919907 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 300033532921919907 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 1273663306374918439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP", + "key": { + "ledger_key_nonce": { + "nonce": 1273663306374918439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4601299207353310938 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4601299207353310938 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4677765900193036446 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7", + "key": { + "ledger_key_nonce": { + "nonce": 4677765900193036446 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5536345977105687142 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5536345977105687142 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5670621023751100817 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P", + "key": { + "ledger_key_nonce": { + "nonce": 5670621023751100817 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6006104520346379553 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6006104520346379553 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6208800374416201873 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7", + "key": { + "ledger_key_nonce": { + "nonce": 6208800374416201873 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 124590656928745377 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 124590656928745377 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 8941506213304483187 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY", + "key": { + "ledger_key_nonce": { + "nonce": 8941506213304483187 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 3312139281147456071 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 3312139281147456071 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 8754220119846337199 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I", + "key": { + "ledger_key_nonce": { + "nonce": 8754220119846337199 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 2841415490237507697 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 2841415490237507697 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 5148037999226383026 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY", + "key": { + "ledger_key_nonce": { + "nonce": 5148037999226383026 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 1242168959743744263 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 1242168959743744263 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 4553542552662768400 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI", + "key": { + "ledger_key_nonce": { + "nonce": 4553542552662768400 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 767083961780241525 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 767083961780241525 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 6310153727739411520 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY", + "key": { + "ledger_key_nonce": { + "nonce": 6310153727739411520 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 394263859078419540 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 394263859078419540 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 1166692687884080826 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI", + "key": { + "ledger_key_nonce": { + "nonce": 1166692687884080826 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 7462478058564425762 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 7462478058564425762 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 9085653633391546739 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY", + "key": { + "ledger_key_nonce": { + "nonce": 9085653633391546739 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 5567623040284808000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 5567623040284808000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 7542349592066956260 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII", + "key": { + "ledger_key_nonce": { + "nonce": 7542349592066956260 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 354189697570339794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 354189697570339794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 1427764051160478586 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ", + "key": { + "ledger_key_nonce": { + "nonce": 1427764051160478586 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 1890705647580152636 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 1890705647580152636 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 5929428834697765953 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J", + "key": { + "ledger_key_nonce": { + "nonce": 5929428834697765953 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 3292169524723964477 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 3292169524723964477 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 6162416380643872607 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ", + "key": { + "ledger_key_nonce": { + "nonce": 6162416380643872607 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 8886531160246778710 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 8886531160246778710 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 9168604641596501804 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ", + "key": { + "ledger_key_nonce": { + "nonce": 9168604641596501804 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 878113941924154464 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 878113941924154464 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 7603161247662026985 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ", + "key": { + "ledger_key_nonce": { + "nonce": 7603161247662026985 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 1022041161511539345 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 1022041161511539345 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 6962827370825955938 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J", + "key": { + "ledger_key_nonce": { + "nonce": 6962827370825955938 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 5214782575861413720 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 5214782575861413720 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 6536393324450770693 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ", + "key": { + "ledger_key_nonce": { + "nonce": 6536393324450770693 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 2337338159406607218 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 2337338159406607218 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 7989749295507198727 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ", + "key": { + "ledger_key_nonce": { + "nonce": 7989749295507198727 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 1795696960866358347 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 1795696960866358347 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 2132013547778639677 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K", + "key": { + "ledger_key_nonce": { + "nonce": 2132013547778639677 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 3692835619527640791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 3692835619527640791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 4183239946648934021 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2", + "key": { + "ledger_key_nonce": { + "nonce": 4183239946648934021 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7053573266638440948 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7053573266638440948 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7146456229595295753 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK", + "key": { + "ledger_key_nonce": { + "nonce": 7146456229595295753 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 725138602857225060 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 725138602857225060 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 4871800790448612197 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2", + "key": { + "ledger_key_nonce": { + "nonce": 4871800790448612197 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 5731709686649193738 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 5731709686649193738 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 7300235145643751250 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK", + "key": { + "ledger_key_nonce": { + "nonce": 7300235145643751250 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 7221074154173408343 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 7221074154173408343 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 8727160423468316038 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2", + "key": { + "ledger_key_nonce": { + "nonce": 8727160423468316038 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 3095084508008659227 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 3095084508008659227 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 4574976570823973688 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK", + "key": { + "ledger_key_nonce": { + "nonce": 4574976570823973688 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 3115594559043080832 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 3115594559043080832 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 9008986787791471439 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2", + "key": { + "ledger_key_nonce": { + "nonce": 9008986787791471439 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + "key": { + "ledger_key_nonce": { + "nonce": 902749361495937976 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + "key": { + "ledger_key_nonce": { + "nonce": 902749361495937976 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + "key": { + "ledger_key_nonce": { + "nonce": 4936276509501663562 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L", + "key": { + "ledger_key_nonce": { + "nonce": 4936276509501663562 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_charge" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 20 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "batch_charge" + }, + { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BV5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6J5N" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB6KO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDWC6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFO3O" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHGT6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI7IO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKXA6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMPZO" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOHR6" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABR4OP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTUG7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVM7P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXEX7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABY5MP" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2VE7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4N5P" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6FV7" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBKTY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDC3I" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACF2CY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHSKI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACILRY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKDZI" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM3AY" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOTII" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRIXZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTA7J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVYGZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQOJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYJVZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2B5J" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ZEZ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6RMJ" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBG3K" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDOT2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFWKK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH6C2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIHZK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKPR2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMXIK" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADO7A2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRE7L" + } + ] + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 20 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_paused.1.json b/contract/test_snapshots/test/test_batch_charge_paused.1.json index b2045a7..f0cc69d 100644 --- a/contract/test_snapshots/test/test_batch_charge_paused.1.json +++ b/contract/test_snapshots/test/test_batch_charge_paused.1.json @@ -1909,4 +1909,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_single_interesting_failure_emits_with_not_due_count.1.json b/contract/test_snapshots/test/test_batch_charge_single_interesting_failure_emits_with_not_due_count.1.json index cef41a6..61c5df4 100644 --- a/contract/test_snapshots/test/test_batch_charge_single_interesting_failure_emits_with_not_due_count.1.json +++ b/contract/test_snapshots/test/test_batch_charge_single_interesting_failure_emits_with_not_due_count.1.json @@ -2239,4 +2239,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_with_fee.1.json b/contract/test_snapshots/test/test_batch_charge_with_fee.1.json index f00d6e3..97b2da1 100644 --- a/contract/test_snapshots/test/test_batch_charge_with_fee.1.json +++ b/contract/test_snapshots/test/test_batch_charge_with_fee.1.json @@ -4621,4 +4621,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_charge_zero_allowance_returns_allowance_insufficient.1.json b/contract/test_snapshots/test/test_batch_charge_zero_allowance_returns_allowance_insufficient.1.json index 04b25e2..34e8ea8 100644 --- a/contract/test_snapshots/test/test_batch_charge_zero_allowance_returns_allowance_insufficient.1.json +++ b/contract/test_snapshots/test/test_batch_charge_zero_allowance_returns_allowance_insufficient.1.json @@ -2181,4 +2181,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_extend_extends_pause_expiry_when_present.1.json b/contract/test_snapshots/test/test_batch_extend_extends_pause_expiry_when_present.1.json index 1c61700..29d8184 100644 --- a/contract/test_snapshots/test/test_batch_extend_extends_pause_expiry_when_present.1.json +++ b/contract/test_snapshots/test/test_batch_extend_extends_pause_expiry_when_present.1.json @@ -1823,4 +1823,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown.1.json b/contract/test_snapshots/test/test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown.1.json index d65f5f6..1d07347 100644 --- a/contract/test_snapshots/test/test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown.1.json +++ b/contract/test_snapshots/test/test_batch_extend_subscription_ttl_extends_valid_and_skips_unknown.1.json @@ -2401,4 +2401,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_extend_subscription_ttl_over_limit_panics.1.json b/contract/test_snapshots/test/test_batch_extend_subscription_ttl_over_limit_panics.1.json index 4478d28..8b9f7a6 100644 --- a/contract/test_snapshots/test/test_batch_extend_subscription_ttl_over_limit_panics.1.json +++ b/contract/test_snapshots/test/test_batch_extend_subscription_ttl_over_limit_panics.1.json @@ -1365,4 +1365,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_admin_success.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_admin_success.1.json new file mode 100644 index 0000000..fbf137f --- /dev/null +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_admin_success.1.json @@ -0,0 +1,2358 @@ +{ + "generators": { + "address": 7, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "batch_pause_subscriptions", + "args": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_pause_subscriptions" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscription_paused" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "batch_pause_subscriptions" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_exceeds_max_size_panics.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_exceeds_max_size_panics.1.json index 293cb1c..23f8dcf 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_exceeds_max_size_panics.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_exceeds_max_size_panics.1.json @@ -1228,4 +1228,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts.1.json index 57e5e75..6ad27de 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_handles_valid_missing_and_pre_paused_accounts.1.json @@ -3200,4 +3200,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_mixed_inputs.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_mixed_inputs.1.json index 297d6e1..b996e6f 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_mixed_inputs.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_mixed_inputs.1.json @@ -6024,4 +6024,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_no_admin_panics.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_no_admin_panics.1.json new file mode 100644 index 0000000..08c7a13 --- /dev/null +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "batch_pause_subscriptions" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#221)'" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "batch_pause_subscriptions" + }, + { + "vec": [ + { + "vec": [] + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_non_admin_panics.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_non_admin_panics.1.json index 5010ede..1d1cc65 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_non_admin_panics.1.json @@ -1783,4 +1783,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts.1.json index 31ebb59..cac25c5 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_rejects_more_than_twenty_five_accounts.1.json @@ -1228,4 +1228,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_batch_pause_subscriptions_requires_admin_auth.1.json b/contract/test_snapshots/test/test_batch_pause_subscriptions_requires_admin_auth.1.json index 66a741e..2098fc2 100644 --- a/contract/test_snapshots/test/test_batch_pause_subscriptions_requires_admin_auth.1.json +++ b/contract/test_snapshots/test/test_batch_pause_subscriptions_requires_admin_auth.1.json @@ -3,7 +3,10 @@ "address": 3, "nonce": 0 }, - "auth": [[], []], + "auth": [ + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -264,4 +267,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_bump_subscription_extends_pause_expiry_when_present.1.json b/contract/test_snapshots/test/test_bump_subscription_extends_pause_expiry_when_present.1.json index d94bf99..0e7899a 100644 --- a/contract/test_snapshots/test/test_bump_subscription_extends_pause_expiry_when_present.1.json +++ b/contract/test_snapshots/test/test_bump_subscription_extends_pause_expiry_when_present.1.json @@ -1814,4 +1814,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_bump_subscription_no_op_on_absent_pause_expiry.1.json b/contract/test_snapshots/test/test_bump_subscription_no_op_on_absent_pause_expiry.1.json index 052213b..76e4c47 100644 --- a/contract/test_snapshots/test/test_bump_subscription_no_op_on_absent_pause_expiry.1.json +++ b/contract/test_snapshots/test/test_bump_subscription_no_op_on_absent_pause_expiry.1.json @@ -1638,4 +1638,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow.1.json b/contract/test_snapshots/test/test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow.1.json index 5d70505..1bd0b88 100644 --- a/contract/test_snapshots/test/test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow.1.json +++ b/contract/test_snapshots/test/test_calculate_fee_amount_at_max_subscription_amount_does_not_overflow.1.json @@ -885,4 +885,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_calculate_fee_amount_overflow_fails_with_typed_error.1.json b/contract/test_snapshots/test/test_calculate_fee_amount_overflow_fails_with_typed_error.1.json index 22478f8..a45f47a 100644 --- a/contract/test_snapshots/test/test_calculate_fee_amount_overflow_fails_with_typed_error.1.json +++ b/contract/test_snapshots/test/test_calculate_fee_amount_overflow_fails_with_typed_error.1.json @@ -941,4 +941,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_cancel.1.json b/contract/test_snapshots/test/test_cancel.1.json index deef9cc..7c88798 100644 --- a/contract/test_snapshots/test/test_cancel.1.json +++ b/contract/test_snapshots/test/test_cancel.1.json @@ -1860,4 +1860,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_cancel_after_grace_lapse_succeeds.1.json b/contract/test_snapshots/test/test_cancel_after_grace_lapse_succeeds.1.json index 1eb974f..e687159 100644 --- a/contract/test_snapshots/test/test_cancel_after_grace_lapse_succeeds.1.json +++ b/contract/test_snapshots/test/test_cancel_after_grace_lapse_succeeds.1.json @@ -23,6 +23,7 @@ } ] ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", @@ -511,7 +512,7 @@ }, "ext": "v0" }, - 4095 + 6307200 ] ], [ @@ -699,6 +700,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" @@ -2195,6 +2204,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" diff --git a/contract/test_snapshots/test/test_cancel_and_refund_prorated_missing_subscription_panics.1.json b/contract/test_snapshots/test/test_cancel_and_refund_prorated_missing_subscription_panics.1.json index 045d081..fc40895 100644 --- a/contract/test_snapshots/test/test_cancel_and_refund_prorated_missing_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_cancel_and_refund_prorated_missing_subscription_panics.1.json @@ -1067,4 +1067,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_cancel_and_refund_prorated_transfers_expected_amount.1.json b/contract/test_snapshots/test/test_cancel_and_refund_prorated_transfers_expected_amount.1.json index cd69e39..1e85aa7 100644 --- a/contract/test_snapshots/test/test_cancel_and_refund_prorated_transfers_expected_amount.1.json +++ b/contract/test_snapshots/test/test_cancel_and_refund_prorated_transfers_expected_amount.1.json @@ -2534,4 +2534,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_cancel_nonexistent.1.json b/contract/test_snapshots/test/test_cancel_nonexistent.1.json index 1870fe9..65dcc4b 100644 --- a/contract/test_snapshots/test/test_cancel_nonexistent.1.json +++ b/contract/test_snapshots/test/test_cancel_nonexistent.1.json @@ -1057,4 +1057,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_after_cancel.1.json b/contract/test_snapshots/test/test_charge_after_cancel.1.json index 743a7e0..1dfb507 100644 --- a/contract/test_snapshots/test/test_charge_after_cancel.1.json +++ b/contract/test_snapshots/test/test_charge_after_cancel.1.json @@ -1893,4 +1893,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_after_grace_window_panics.1.json b/contract/test_snapshots/test/test_charge_after_grace_window_panics.1.json index 5270b5d..8bd4293 100644 --- a/contract/test_snapshots/test/test_charge_after_grace_window_panics.1.json +++ b/contract/test_snapshots/test/test_charge_after_grace_window_panics.1.json @@ -2019,4 +2019,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_allowance_below_gross_fails_closed_before_any_transfer.1.json b/contract/test_snapshots/test/test_charge_allowance_below_gross_fails_closed_before_any_transfer.1.json index 66b2c66..622a5eb 100644 --- a/contract/test_snapshots/test/test_charge_allowance_below_gross_fails_closed_before_any_transfer.1.json +++ b/contract/test_snapshots/test/test_charge_allowance_below_gross_fails_closed_before_any_transfer.1.json @@ -2412,4 +2412,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_applies_protocol_fee_and_records_net_revenue.1.json b/contract/test_snapshots/test/test_charge_applies_protocol_fee_and_records_net_revenue.1.json index 44dd9c5..ce06960 100644 --- a/contract/test_snapshots/test/test_charge_applies_protocol_fee_and_records_net_revenue.1.json +++ b/contract/test_snapshots/test/test_charge_applies_protocol_fee_and_records_net_revenue.1.json @@ -2970,4 +2970,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_before_trial_end_panics.1.json b/contract/test_snapshots/test/test_charge_before_trial_end_panics.1.json index 2e5425f..7d2ddcb 100644 --- a/contract/test_snapshots/test/test_charge_before_trial_end_panics.1.json +++ b/contract/test_snapshots/test/test_charge_before_trial_end_panics.1.json @@ -1766,4 +1766,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_exact_gross_allowance_succeeds_with_fee.1.json b/contract/test_snapshots/test/test_charge_exact_gross_allowance_succeeds_with_fee.1.json index 8052b88..f0ae809 100644 --- a/contract/test_snapshots/test/test_charge_exact_gross_allowance_succeeds_with_fee.1.json +++ b/contract/test_snapshots/test/test_charge_exact_gross_allowance_succeeds_with_fee.1.json @@ -3097,4 +3097,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_exact_transfer_amount.1.json b/contract/test_snapshots/test/test_charge_exact_transfer_amount.1.json index 192b955..3d988e0 100644 --- a/contract/test_snapshots/test/test_charge_exact_transfer_amount.1.json +++ b/contract/test_snapshots/test/test_charge_exact_transfer_amount.1.json @@ -2441,4 +2441,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_history_capped_at_12.1.json b/contract/test_snapshots/test/test_charge_history_capped_at_12.1.json index 2d2ae5e..0eb0da9 100644 --- a/contract/test_snapshots/test/test_charge_history_capped_at_12.1.json +++ b/contract/test_snapshots/test/test_charge_history_capped_at_12.1.json @@ -6847,4 +6847,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_history_recorded.1.json b/contract/test_snapshots/test/test_charge_history_recorded.1.json index 1b28535..547c1c2 100644 --- a/contract/test_snapshots/test/test_charge_history_recorded.1.json +++ b/contract/test_snapshots/test/test_charge_history_recorded.1.json @@ -2333,4 +2333,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_history_sort_ascending_and_descending.1.json b/contract/test_snapshots/test/test_charge_history_sort_ascending_and_descending.1.json index 2cedfd3..ca6dd12 100644 --- a/contract/test_snapshots/test/test_charge_history_sort_ascending_and_descending.1.json +++ b/contract/test_snapshots/test/test_charge_history_sort_ascending_and_descending.1.json @@ -4323,4 +4323,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_history_sort_edge_cases.1.json b/contract/test_snapshots/test/test_charge_history_sort_edge_cases.1.json index 11fd76b..7557198 100644 --- a/contract/test_snapshots/test/test_charge_history_sort_edge_cases.1.json +++ b/contract/test_snapshots/test/test_charge_history_sort_edge_cases.1.json @@ -2552,4 +2552,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_insufficient_allowance.1.json b/contract/test_snapshots/test/test_charge_insufficient_allowance.1.json index 84eaa46..6214c64 100644 --- a/contract/test_snapshots/test/test_charge_insufficient_allowance.1.json +++ b/contract/test_snapshots/test/test_charge_insufficient_allowance.1.json @@ -1987,4 +1987,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_max_bps_exact_allowance_succeeds.1.json b/contract/test_snapshots/test/test_charge_max_bps_exact_allowance_succeeds.1.json index f5ba70b..3b6c08f 100644 --- a/contract/test_snapshots/test/test_charge_max_bps_exact_allowance_succeeds.1.json +++ b/contract/test_snapshots/test/test_charge_max_bps_exact_allowance_succeeds.1.json @@ -3037,4 +3037,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_on_paused_subscription_panics.1.json b/contract/test_snapshots/test/test_charge_on_paused_subscription_panics.1.json index d767a38..d0c0eea 100644 --- a/contract/test_snapshots/test/test_charge_on_paused_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_charge_on_paused_subscription_panics.1.json @@ -1927,4 +1927,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_result_round_trip.1.json b/contract/test_snapshots/test/test_charge_result_round_trip.1.json index edafb2e..a9c9276 100644 --- a/contract/test_snapshots/test/test_charge_result_round_trip.1.json +++ b/contract/test_snapshots/test/test_charge_result_round_trip.1.json @@ -70,4 +70,4 @@ ] }, "events": [] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_result_variant_count.1.json b/contract/test_snapshots/test/test_charge_result_variant_count.1.json index edafb2e..a9c9276 100644 --- a/contract/test_snapshots/test/test_charge_result_variant_count.1.json +++ b/contract/test_snapshots/test/test_charge_result_variant_count.1.json @@ -70,4 +70,4 @@ ] }, "events": [] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_routes_net_to_custom_recipient.1.json b/contract/test_snapshots/test/test_charge_routes_net_to_custom_recipient.1.json index 209e970..d4a5e1e 100644 --- a/contract/test_snapshots/test/test_charge_routes_net_to_custom_recipient.1.json +++ b/contract/test_snapshots/test/test_charge_routes_net_to_custom_recipient.1.json @@ -3069,4 +3069,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_succeeds_after_merchant_frozen.1.json b/contract/test_snapshots/test/test_charge_succeeds_after_merchant_frozen.1.json index 281bbd4..6cc68c3 100644 --- a/contract/test_snapshots/test/test_charge_succeeds_after_merchant_frozen.1.json +++ b/contract/test_snapshots/test/test_charge_succeeds_after_merchant_frozen.1.json @@ -2603,4 +2603,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_too_early.1.json b/contract/test_snapshots/test/test_charge_too_early.1.json index 9ca121f..599f722 100644 --- a/contract/test_snapshots/test/test_charge_too_early.1.json +++ b/contract/test_snapshots/test/test_charge_too_early.1.json @@ -1762,4 +1762,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_updates_last_charged.1.json b/contract/test_snapshots/test/test_charge_updates_last_charged.1.json index b9bdf7a..80e1409 100644 --- a/contract/test_snapshots/test/test_charge_updates_last_charged.1.json +++ b/contract/test_snapshots/test/test_charge_updates_last_charged.1.json @@ -2369,4 +2369,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance.1.json b/contract/test_snapshots/test/test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance.1.json index 727f857..3589d90 100644 --- a/contract/test_snapshots/test/test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance.1.json +++ b/contract/test_snapshots/test/test_charge_with_fee_rounding_to_zero_uses_full_gross_allowance.1.json @@ -2845,4 +2845,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_with_zero_fee_bps_skips_fee_transfer.1.json b/contract/test_snapshots/test/test_charge_with_zero_fee_bps_skips_fee_transfer.1.json index b9fe5d0..73e53c7 100644 --- a/contract/test_snapshots/test/test_charge_with_zero_fee_bps_skips_fee_transfer.1.json +++ b/contract/test_snapshots/test/test_charge_with_zero_fee_bps_skips_fee_transfer.1.json @@ -2734,4 +2734,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charge_within_grace_window_succeeds.1.json b/contract/test_snapshots/test/test_charge_within_grace_window_succeeds.1.json index 127f7fc..b578644 100644 --- a/contract/test_snapshots/test/test_charge_within_grace_window_succeeds.1.json +++ b/contract/test_snapshots/test/test_charge_within_grace_window_succeeds.1.json @@ -2626,4 +2626,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_charged_event_includes_ledger_sequence.1.json b/contract/test_snapshots/test/test_charged_event_includes_ledger_sequence.1.json index 4a4f3ed..a01102b 100644 --- a/contract/test_snapshots/test/test_charged_event_includes_ledger_sequence.1.json +++ b/contract/test_snapshots/test/test_charged_event_includes_ledger_sequence.1.json @@ -2229,4 +2229,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_charge_history_admin_succeeds.1.json b/contract/test_snapshots/test/test_clear_charge_history_admin_succeeds.1.json index 58dbe70..8cee38e 100644 --- a/contract/test_snapshots/test/test_clear_charge_history_admin_succeeds.1.json +++ b/contract/test_snapshots/test/test_clear_charge_history_admin_succeeds.1.json @@ -2396,4 +2396,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_charge_history_non_admin_panics.1.json b/contract/test_snapshots/test/test_clear_charge_history_non_admin_panics.1.json index 43d2e24..f6a20fe 100644 --- a/contract/test_snapshots/test/test_clear_charge_history_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_clear_charge_history_non_admin_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_charge_history_nonexistent_key_no_panic.1.json b/contract/test_snapshots/test/test_clear_charge_history_nonexistent_key_no_panic.1.json index 8ac300b..4a51013 100644 --- a/contract/test_snapshots/test/test_clear_charge_history_nonexistent_key_no_panic.1.json +++ b/contract/test_snapshots/test/test_clear_charge_history_nonexistent_key_no_panic.1.json @@ -996,4 +996,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_fee_admin_success.1.json b/contract/test_snapshots/test/test_clear_fee_admin_success.1.json new file mode 100644 index 0000000..8acdc29 --- /dev/null +++ b/contract/test_snapshots/test/test_clear_fee_admin_success.1.json @@ -0,0 +1,1368 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "propose_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit_fee", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "clear_fee", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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": "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "propose_fee" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "fee_proposed" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "commit_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "fee_committed" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "commit_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_fee" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "clear_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "fee_cleared" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "clear_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_fee_no_admin_panics.1.json b/contract/test_snapshots/test/test_clear_fee_no_admin_panics.1.json new file mode 100644 index 0000000..59b9aed --- /dev/null +++ b/contract/test_snapshots/test/test_clear_fee_no_admin_panics.1.json @@ -0,0 +1,992 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "clear_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "string": "caught panic 'admin not set' from contract function 'Symbol(clear_fee)'" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "clear_fee" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_merchant_revenue_history_drops_history.1.json b/contract/test_snapshots/test/test_clear_merchant_revenue_history_drops_history.1.json index c6f606d..618e442 100644 --- a/contract/test_snapshots/test/test_clear_merchant_revenue_history_drops_history.1.json +++ b/contract/test_snapshots/test/test_clear_merchant_revenue_history_drops_history.1.json @@ -81,7 +81,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -1025,7 +1043,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary" @@ -1040,7 +1058,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary", @@ -1058,7 +1076,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 4270020994084947596 } }, "durability": "temporary" @@ -1073,7 +1091,40 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -2583,4 +2634,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_merchant_revenue_history_idempotent.1.json b/contract/test_snapshots/test/test_clear_merchant_revenue_history_idempotent.1.json index aa263af..d811670 100644 --- a/contract/test_snapshots/test/test_clear_merchant_revenue_history_idempotent.1.json +++ b/contract/test_snapshots/test/test_clear_merchant_revenue_history_idempotent.1.json @@ -81,7 +81,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", @@ -349,6 +367,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -1239,4 +1290,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_merchant_revenue_history_non_admin_panics.1.json b/contract/test_snapshots/test/test_clear_merchant_revenue_history_non_admin_panics.1.json index cdb92fa..ab12098 100644 --- a/contract/test_snapshots/test/test_clear_merchant_revenue_history_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_clear_merchant_revenue_history_non_admin_panics.1.json @@ -1027,4 +1027,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_clear_metadata_removes_label.1.json b/contract/test_snapshots/test/test_clear_metadata_removes_label.1.json index 6bbd626..7595ffb 100644 --- a/contract/test_snapshots/test/test_clear_metadata_removes_label.1.json +++ b/contract/test_snapshots/test/test_clear_metadata_removes_label.1.json @@ -1895,4 +1895,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_emits_fee_committed_event.1.json b/contract/test_snapshots/test/test_commit_fee_emits_fee_committed_event.1.json index 49fcd12..a928fce 100644 --- a/contract/test_snapshots/test/test_commit_fee_emits_fee_committed_event.1.json +++ b/contract/test_snapshots/test/test_commit_fee_emits_fee_committed_event.1.json @@ -1177,4 +1177,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_above_max.1.json b/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_above_max.1.json index 08fe378..c593014 100644 --- a/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_above_max.1.json +++ b/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_above_max.1.json @@ -1379,4 +1379,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_below_min.1.json b/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_below_min.1.json index 7e3ed94..85b41f0 100644 --- a/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_below_min.1.json +++ b/contract/test_snapshots/test/test_commit_fee_rejects_when_bounds_tightened_below_min.1.json @@ -1379,4 +1379,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_succeeds_when_within_bounds.1.json b/contract/test_snapshots/test/test_commit_fee_succeeds_when_within_bounds.1.json index 912dd54..befbbcf 100644 --- a/contract/test_snapshots/test/test_commit_fee_succeeds_when_within_bounds.1.json +++ b/contract/test_snapshots/test/test_commit_fee_succeeds_when_within_bounds.1.json @@ -1365,4 +1365,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_succeeds_with_default_bounds.1.json b/contract/test_snapshots/test/test_commit_fee_succeeds_with_default_bounds.1.json index 95241c5..020bc1d 100644 --- a/contract/test_snapshots/test/test_commit_fee_succeeds_with_default_bounds.1.json +++ b/contract/test_snapshots/test/test_commit_fee_succeeds_with_default_bounds.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_commit_fee_without_proposal_panics.1.json b/contract/test_snapshots/test/test_commit_fee_without_proposal_panics.1.json index ae1a0ae..6fea761 100644 --- a/contract/test_snapshots/test/test_commit_fee_without_proposal_panics.1.json +++ b/contract/test_snapshots/test/test_commit_fee_without_proposal_panics.1.json @@ -1064,4 +1064,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_contract_config.1.json b/contract/test_snapshots/test/test_contract_config.1.json index c1e1d53..6a282b6 100644 --- a/contract/test_snapshots/test/test_contract_config.1.json +++ b/contract/test_snapshots/test/test_contract_config.1.json @@ -1139,4 +1139,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_contract_pause_events_emitted.1.json b/contract/test_snapshots/test/test_contract_pause_events_emitted.1.json index 3ef7746..75a2a60 100644 --- a/contract/test_snapshots/test/test_contract_pause_events_emitted.1.json +++ b/contract/test_snapshots/test/test_contract_pause_events_emitted.1.json @@ -1227,4 +1227,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_custom_sac_token_end_to_end_flow.1.json b/contract/test_snapshots/test/test_custom_sac_token_end_to_end_flow.1.json index 40289f4..40eb2ea 100644 --- a/contract/test_snapshots/test/test_custom_sac_token_end_to_end_flow.1.json +++ b/contract/test_snapshots/test/test_custom_sac_token_end_to_end_flow.1.json @@ -4170,4 +4170,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_accumulates_across_calls.1.json b/contract/test_snapshots/test/test_daily_limit_accumulates_across_calls.1.json index 0b291b7..80c11d9 100644 --- a/contract/test_snapshots/test/test_daily_limit_accumulates_across_calls.1.json +++ b/contract/test_snapshots/test/test_daily_limit_accumulates_across_calls.1.json @@ -2846,4 +2846,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_allows_spend_within_limit.1.json b/contract/test_snapshots/test/test_daily_limit_allows_spend_within_limit.1.json index 2f7031d..87bb464 100644 --- a/contract/test_snapshots/test/test_daily_limit_allows_spend_within_limit.1.json +++ b/contract/test_snapshots/test/test_daily_limit_allows_spend_within_limit.1.json @@ -2520,4 +2520,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_blocks_cumulative_overspend.1.json b/contract/test_snapshots/test/test_daily_limit_blocks_cumulative_overspend.1.json index a6f78ec..180ec20 100644 --- a/contract/test_snapshots/test/test_daily_limit_blocks_cumulative_overspend.1.json +++ b/contract/test_snapshots/test/test_daily_limit_blocks_cumulative_overspend.1.json @@ -2709,4 +2709,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_blocks_overspend.1.json b/contract/test_snapshots/test/test_daily_limit_blocks_overspend.1.json index 766025b..b8ff651 100644 --- a/contract/test_snapshots/test/test_daily_limit_blocks_overspend.1.json +++ b/contract/test_snapshots/test/test_daily_limit_blocks_overspend.1.json @@ -1967,4 +1967,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_day_start_boundary.1.json b/contract/test_snapshots/test/test_daily_limit_day_start_boundary.1.json index 706648e..826b0ff 100644 --- a/contract/test_snapshots/test/test_daily_limit_day_start_boundary.1.json +++ b/contract/test_snapshots/test/test_daily_limit_day_start_boundary.1.json @@ -3576,4 +3576,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_removed_event_emitted.1.json b/contract/test_snapshots/test/test_daily_limit_removed_event_emitted.1.json index 61d3d75..de7f6ff 100644 --- a/contract/test_snapshots/test/test_daily_limit_removed_event_emitted.1.json +++ b/contract/test_snapshots/test/test_daily_limit_removed_event_emitted.1.json @@ -1193,4 +1193,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_set_event_emitted.1.json b/contract/test_snapshots/test/test_daily_limit_set_event_emitted.1.json index 81cea17..cebe2c2 100644 --- a/contract/test_snapshots/test/test_daily_limit_set_event_emitted.1.json +++ b/contract/test_snapshots/test/test_daily_limit_set_event_emitted.1.json @@ -1073,4 +1073,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_limit_visibility_and_spend_tracking.1.json b/contract/test_snapshots/test/test_daily_limit_visibility_and_spend_tracking.1.json index 681144b..63c3adb 100644 --- a/contract/test_snapshots/test/test_daily_limit_visibility_and_spend_tracking.1.json +++ b/contract/test_snapshots/test/test_daily_limit_visibility_and_spend_tracking.1.json @@ -2780,4 +2780,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_daily_spent_reset.1.json b/contract/test_snapshots/test/test_daily_spent_reset.1.json index 6467924..8e18fd7 100644 --- a/contract/test_snapshots/test/test_daily_spent_reset.1.json +++ b/contract/test_snapshots/test/test_daily_spent_reset.1.json @@ -1065,4 +1065,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_double_commit_without_repropose_panics.1.json b/contract/test_snapshots/test/test_double_commit_without_repropose_panics.1.json index 657f751..88f932b 100644 --- a/contract/test_snapshots/test/test_double_commit_without_repropose_panics.1.json +++ b/contract/test_snapshots/test/test_double_commit_without_repropose_panics.1.json @@ -1344,4 +1344,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_double_initialize.1.json b/contract/test_snapshots/test/test_double_initialize.1.json index f132395..b1cb88e 100644 --- a/contract/test_snapshots/test/test_double_initialize.1.json +++ b/contract/test_snapshots/test/test_double_initialize.1.json @@ -1200,4 +1200,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_emits_event_with_count.1.json b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_emits_event_with_count.1.json index f93637f..3ad88e8 100644 --- a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_emits_event_with_count.1.json +++ b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_emits_event_with_count.1.json @@ -2728,4 +2728,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_empty_index_noop.1.json b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_empty_index_noop.1.json index ed2bf17..ac6b6a2 100644 --- a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_empty_index_noop.1.json +++ b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_empty_index_noop.1.json @@ -1086,4 +1086,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_extends_large_index.1.json b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_extends_large_index.1.json index 7b99552..417a7ef 100644 --- a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_extends_large_index.1.json +++ b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_extends_large_index.1.json @@ -6109,4 +6109,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_non_admin_panics.1.json b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_non_admin_panics.1.json index 175126e..12e192a 100644 --- a/contract/test_snapshots/test/test_extend_subscriber_index_ttl_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_extend_subscriber_index_ttl_non_admin_panics.1.json @@ -1064,4 +1064,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_trial_overflow_fails_with_typed_error.1.json b/contract/test_snapshots/test/test_extend_trial_overflow_fails_with_typed_error.1.json index 15265c1..3681f39 100644 --- a/contract/test_snapshots/test/test_extend_trial_overflow_fails_with_typed_error.1.json +++ b/contract/test_snapshots/test/test_extend_trial_overflow_fails_with_typed_error.1.json @@ -2184,4 +2184,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_extend_trial_pushes_last_charged_forward.1.json b/contract/test_snapshots/test/test_extend_trial_pushes_last_charged_forward.1.json index 638f59e..13296d1 100644 --- a/contract/test_snapshots/test/test_extend_trial_pushes_last_charged_forward.1.json +++ b/contract/test_snapshots/test/test_extend_trial_pushes_last_charged_forward.1.json @@ -2026,4 +2026,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_freeze_merchant_admin_success.1.json b/contract/test_snapshots/test/test_freeze_merchant_admin_success.1.json new file mode 100644 index 0000000..8e8dd3c --- /dev/null +++ b/contract/test_snapshots/test/test_freeze_merchant_admin_success.1.json @@ -0,0 +1,1250 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "freeze_merchant", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "MerchantFrozen" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantFrozen" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "freeze_merchant" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "merchant_frozen" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "freeze_merchant" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "is_merchant_frozen" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "is_merchant_frozen" + } + ], + "data": { + "bool": true + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_freeze_merchant_idempotent.1.json b/contract/test_snapshots/test/test_freeze_merchant_idempotent.1.json index 72a2599..68d2f2f 100644 --- a/contract/test_snapshots/test/test_freeze_merchant_idempotent.1.json +++ b/contract/test_snapshots/test/test_freeze_merchant_idempotent.1.json @@ -1373,4 +1373,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_freeze_merchant_independent_of_whitelist.1.json b/contract/test_snapshots/test/test_freeze_merchant_independent_of_whitelist.1.json index e30c12a..0357f6f 100644 --- a/contract/test_snapshots/test/test_freeze_merchant_independent_of_whitelist.1.json +++ b/contract/test_snapshots/test/test_freeze_merchant_independent_of_whitelist.1.json @@ -1347,4 +1347,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_freeze_merchant_no_admin_panics.1.json b/contract/test_snapshots/test/test_freeze_merchant_no_admin_panics.1.json new file mode 100644 index 0000000..99af6e5 --- /dev/null +++ b/contract/test_snapshots/test/test_freeze_merchant_no_admin_panics.1.json @@ -0,0 +1,1012 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "freeze_merchant" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "void" + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "freeze_merchant" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "void" + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_freeze_merchant_non_admin_panics.1.json b/contract/test_snapshots/test/test_freeze_merchant_non_admin_panics.1.json index ea4fd3d..7d25001 100644 --- a/contract/test_snapshots/test/test_freeze_merchant_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_freeze_merchant_non_admin_panics.1.json @@ -1034,4 +1034,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_count.1.json b/contract/test_snapshots/test/test_get_charge_history_count.1.json index e12d538..586132e 100644 --- a/contract/test_snapshots/test/test_get_charge_history_count.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_count.1.json @@ -8178,4 +8178,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_empty_for_no_history.1.json b/contract/test_snapshots/test/test_get_charge_history_empty_for_no_history.1.json index 9492dc1..c26403a 100644 --- a/contract/test_snapshots/test/test_get_charge_history_empty_for_no_history.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_empty_for_no_history.1.json @@ -934,4 +934,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_page_limit_capped_at_12.1.json b/contract/test_snapshots/test/test_get_charge_history_page_limit_capped_at_12.1.json index ce3d4e8..0f29fc9 100644 --- a/contract/test_snapshots/test/test_get_charge_history_page_limit_capped_at_12.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_page_limit_capped_at_12.1.json @@ -6860,4 +6860,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_page_offset_beyond_length.1.json b/contract/test_snapshots/test/test_get_charge_history_page_offset_beyond_length.1.json index eb83db9..6484b9b 100644 --- a/contract/test_snapshots/test/test_get_charge_history_page_offset_beyond_length.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_page_offset_beyond_length.1.json @@ -2292,4 +2292,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_page_offset_limit.1.json b/contract/test_snapshots/test/test_get_charge_history_page_offset_limit.1.json index 1fdd0c1..c0498e4 100644 --- a/contract/test_snapshots/test/test_get_charge_history_page_offset_limit.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_page_offset_limit.1.json @@ -2997,4 +2997,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_charge_history_three_charges_ascending.1.json b/contract/test_snapshots/test/test_get_charge_history_three_charges_ascending.1.json index 2c8f15a..60024ae 100644 --- a/contract/test_snapshots/test/test_get_charge_history_three_charges_ascending.1.json +++ b/contract/test_snapshots/test/test_get_charge_history_three_charges_ascending.1.json @@ -2987,4 +2987,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_daily_limit.1.json b/contract/test_snapshots/test/test_get_daily_limit.1.json index b1556bb..ce96060 100644 --- a/contract/test_snapshots/test/test_get_daily_limit.1.json +++ b/contract/test_snapshots/test/test_get_daily_limit.1.json @@ -1174,4 +1174,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_day_start_visibility.1.json b/contract/test_snapshots/test/test_get_day_start_visibility.1.json index 01b8b7b..ae0b4fb 100644 --- a/contract/test_snapshots/test/test_get_day_start_visibility.1.json +++ b/contract/test_snapshots/test/test_get_day_start_visibility.1.json @@ -2852,4 +2852,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_fee_returns_current_fee_settings.1.json b/contract/test_snapshots/test/test_get_fee_returns_current_fee_settings.1.json index 7ab5b50..981c45a 100644 --- a/contract/test_snapshots/test/test_get_fee_returns_current_fee_settings.1.json +++ b/contract/test_snapshots/test/test_get_fee_returns_current_fee_settings.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_global_volume_window_correct_values_after_charge.1.json b/contract/test_snapshots/test/test_get_global_volume_window_correct_values_after_charge.1.json index 4865fa8..0bfa2ae 100644 --- a/contract/test_snapshots/test/test_get_global_volume_window_correct_values_after_charge.1.json +++ b/contract/test_snapshots/test/test_get_global_volume_window_correct_values_after_charge.1.json @@ -2287,4 +2287,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_global_volume_window_resets_after_hour.1.json b/contract/test_snapshots/test/test_get_global_volume_window_resets_after_hour.1.json index d1d6c92..78df0c1 100644 --- a/contract/test_snapshots/test/test_get_global_volume_window_resets_after_hour.1.json +++ b/contract/test_snapshots/test/test_get_global_volume_window_resets_after_hour.1.json @@ -4190,4 +4190,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_global_volume_window_returns_zero_on_fresh_contract.1.json b/contract/test_snapshots/test/test_get_global_volume_window_returns_zero_on_fresh_contract.1.json index fed5997..be038bc 100644 --- a/contract/test_snapshots/test/test_get_global_volume_window_returns_zero_on_fresh_contract.1.json +++ b/contract/test_snapshots/test/test_get_global_volume_window_returns_zero_on_fresh_contract.1.json @@ -942,4 +942,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_grace_period_after_set.1.json b/contract/test_snapshots/test/test_get_grace_period_after_set.1.json index e00a2f3..f3d87c8 100644 --- a/contract/test_snapshots/test/test_get_grace_period_after_set.1.json +++ b/contract/test_snapshots/test/test_get_grace_period_after_set.1.json @@ -1189,4 +1189,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_grace_period_default_zero.1.json b/contract/test_snapshots/test/test_get_grace_period_default_zero.1.json index c46996b..967ce4e 100644 --- a/contract/test_snapshots/test/test_get_grace_period_default_zero.1.json +++ b/contract/test_snapshots/test/test_get_grace_period_default_zero.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_merchant_statuses_empty.1.json b/contract/test_snapshots/test/test_get_merchant_statuses_empty.1.json index 46c5cd5..fb59d95 100644 --- a/contract/test_snapshots/test/test_get_merchant_statuses_empty.1.json +++ b/contract/test_snapshots/test/test_get_merchant_statuses_empty.1.json @@ -934,4 +934,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_merchant_statuses_exceeds_limit_panics.1.json b/contract/test_snapshots/test/test_get_merchant_statuses_exceeds_limit_panics.1.json index b9dfa23..55f759a 100644 --- a/contract/test_snapshots/test/test_get_merchant_statuses_exceeds_limit_panics.1.json +++ b/contract/test_snapshots/test/test_get_merchant_statuses_exceeds_limit_panics.1.json @@ -1365,4 +1365,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_merchant_statuses_mixed.1.json b/contract/test_snapshots/test/test_get_merchant_statuses_mixed.1.json index 5321627..d03c8aa 100644 --- a/contract/test_snapshots/test/test_get_merchant_statuses_mixed.1.json +++ b/contract/test_snapshots/test/test_get_merchant_statuses_mixed.1.json @@ -884,4 +884,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_merchant_statuses_over_configured_cap_panics.1.json b/contract/test_snapshots/test/test_get_merchant_statuses_over_configured_cap_panics.1.json index 6fe2cb7..2672347 100644 --- a/contract/test_snapshots/test/test_get_merchant_statuses_over_configured_cap_panics.1.json +++ b/contract/test_snapshots/test/test_get_merchant_statuses_over_configured_cap_panics.1.json @@ -1201,4 +1201,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_metadata_none_when_not_set.1.json b/contract/test_snapshots/test/test_get_metadata_none_when_not_set.1.json index d1f8392..5680613 100644 --- a/contract/test_snapshots/test/test_get_metadata_none_when_not_set.1.json +++ b/contract/test_snapshots/test/test_get_metadata_none_when_not_set.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_min_interval_default.1.json b/contract/test_snapshots/test/test_get_min_interval_default.1.json index 345d47f..09c294f 100644 --- a/contract/test_snapshots/test/test_get_min_interval_default.1.json +++ b/contract/test_snapshots/test/test_get_min_interval_default.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_next_charge_batch_empty_and_bounds.1.json b/contract/test_snapshots/test/test_get_next_charge_batch_empty_and_bounds.1.json index 170196b..8799266 100644 --- a/contract/test_snapshots/test/test_get_next_charge_batch_empty_and_bounds.1.json +++ b/contract/test_snapshots/test/test_get_next_charge_batch_empty_and_bounds.1.json @@ -910,7 +910,8 @@ }, { "u32": 10 - } + }, + "void" ] } } @@ -966,7 +967,8 @@ }, { "u32": 10 - } + }, + "void" ] } } @@ -998,4 +1000,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_next_charge_batch_exceeds_limit_panics.1.json b/contract/test_snapshots/test/test_get_next_charge_batch_exceeds_limit_panics.1.json index c300ed7..0439037 100644 --- a/contract/test_snapshots/test/test_get_next_charge_batch_exceeds_limit_panics.1.json +++ b/contract/test_snapshots/test/test_get_next_charge_batch_exceeds_limit_panics.1.json @@ -909,7 +909,8 @@ }, { "u32": 51 - } + }, + "void" ] } } @@ -1031,7 +1032,8 @@ }, { "u32": 51 - } + }, + "void" ] } ] @@ -1067,4 +1069,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_next_charge_batch_exclude_lapsed.1.json b/contract/test_snapshots/test/test_get_next_charge_batch_exclude_lapsed.1.json new file mode 100644 index 0000000..ffd1e89 --- /dev/null +++ b/contract/test_snapshots/test/test_get_next_charge_batch_exclude_lapsed.1.json @@ -0,0 +1,2095 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "propose_grace_period", + "args": [ + { + "u64": 86400 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "commit_grace_period", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 172900, + "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": 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": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantSubCount" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndex" + }, + { + "u64": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "SubscriberIndexSlot" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "u64": 0 + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "label" + }, + "val": { + "symbol": "" + } + }, + { + "key": { + "symbol": "last_charged" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "symbol": "trial_duration" + }, + "val": { + "u64": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "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": "ActiveCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "GracePeriod" + } + ] + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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": "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "propose_grace_period" + } + ], + "data": { + "u64": 86400 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "grace_period_proposed" + } + ], + "data": { + "u64": 86400 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose_grace_period" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "commit_grace_period" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "grace_period_committed" + } + ], + "data": { + "u64": 86400 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "commit_grace_period" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 86400 + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "void", + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "allowance" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "allowance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "subscribed" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000 + } + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "ledger_sequence" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 10 + }, + { + "bool": true + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 10 + }, + { + "bool": true + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 10 + }, + "void" + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "u64": 0 + }, + { + "u32": 10 + }, + { + "bool": false + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_next_charge_batch" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_next_charge_batch_filtering.1.json b/contract/test_snapshots/test/test_get_next_charge_batch_filtering.1.json index a001f6a..503d625 100644 --- a/contract/test_snapshots/test/test_get_next_charge_batch_filtering.1.json +++ b/contract/test_snapshots/test/test_get_next_charge_batch_filtering.1.json @@ -4805,7 +4805,8 @@ }, { "u32": 10 - } + }, + "void" ] } } @@ -4841,4 +4842,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_next_charge_batch_pagination.1.json b/contract/test_snapshots/test/test_get_next_charge_batch_pagination.1.json index 10028b5..8411c36 100644 --- a/contract/test_snapshots/test/test_get_next_charge_batch_pagination.1.json +++ b/contract/test_snapshots/test/test_get_next_charge_batch_pagination.1.json @@ -3545,7 +3545,8 @@ }, { "u32": 2 - } + }, + "void" ] } } @@ -3608,7 +3609,8 @@ }, { "u32": 2 - } + }, + "void" ] } } @@ -3644,4 +3646,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_pending_upgrade_none_after_commit.1.json b/contract/test_snapshots/test/test_get_pending_upgrade_none_after_commit.1.json index 157e2b5..4ac10cc 100644 --- a/contract/test_snapshots/test/test_get_pending_upgrade_none_after_commit.1.json +++ b/contract/test_snapshots/test/test_get_pending_upgrade_none_after_commit.1.json @@ -1341,4 +1341,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_pending_upgrade_none_when_not_proposed.1.json b/contract/test_snapshots/test/test_get_pending_upgrade_none_when_not_proposed.1.json index bfa92e2..33c1576 100644 --- a/contract/test_snapshots/test/test_get_pending_upgrade_none_when_not_proposed.1.json +++ b/contract/test_snapshots/test/test_get_pending_upgrade_none_when_not_proposed.1.json @@ -1063,4 +1063,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_pending_upgrade_overwritten_by_second_proposal.1.json b/contract/test_snapshots/test/test_get_pending_upgrade_overwritten_by_second_proposal.1.json index 0595776..2c73e2a 100644 --- a/contract/test_snapshots/test/test_get_pending_upgrade_overwritten_by_second_proposal.1.json +++ b/contract/test_snapshots/test/test_get_pending_upgrade_overwritten_by_second_proposal.1.json @@ -1390,4 +1390,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_pending_upgrade_returns_proposed_hash.1.json b/contract/test_snapshots/test/test_get_pending_upgrade_returns_proposed_hash.1.json index 21e279d..d8fa590 100644 --- a/contract/test_snapshots/test/test_get_pending_upgrade_returns_proposed_hash.1.json +++ b/contract/test_snapshots/test/test_get_pending_upgrade_returns_proposed_hash.1.json @@ -1223,4 +1223,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_protocol_stats_after_subscribe.1.json b/contract/test_snapshots/test/test_get_protocol_stats_after_subscribe.1.json index ba43715..cd3b976 100644 --- a/contract/test_snapshots/test/test_get_protocol_stats_after_subscribe.1.json +++ b/contract/test_snapshots/test/test_get_protocol_stats_after_subscribe.1.json @@ -1692,4 +1692,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_protocol_stats_contract_paused.1.json b/contract/test_snapshots/test/test_get_protocol_stats_contract_paused.1.json index 0b4197f..ede1a71 100644 --- a/contract/test_snapshots/test/test_get_protocol_stats_contract_paused.1.json +++ b/contract/test_snapshots/test/test_get_protocol_stats_contract_paused.1.json @@ -1337,4 +1337,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_protocol_stats_initial.1.json b/contract/test_snapshots/test/test_get_protocol_stats_initial.1.json index ecb87bd..21f04ae 100644 --- a/contract/test_snapshots/test/test_get_protocol_stats_initial.1.json +++ b/contract/test_snapshots/test/test_get_protocol_stats_initial.1.json @@ -987,4 +987,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_protocol_stats_with_fee.1.json b/contract/test_snapshots/test/test_get_protocol_stats_with_fee.1.json index 29bddb1..d1e659b 100644 --- a/contract/test_snapshots/test/test_get_protocol_stats_with_fee.1.json +++ b/contract/test_snapshots/test/test_get_protocol_stats_with_fee.1.json @@ -1282,4 +1282,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_referral_lifecycle.1.json b/contract/test_snapshots/test/test_get_referral_lifecycle.1.json index 52dcfa3..84f7cd8 100644 --- a/contract/test_snapshots/test/test_get_referral_lifecycle.1.json +++ b/contract/test_snapshots/test/test_get_referral_lifecycle.1.json @@ -2362,4 +2362,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_schema_version_returns_zero_and_updates.1.json b/contract/test_snapshots/test/test_get_schema_version_returns_zero_and_updates.1.json index a2435d6..e3da239 100644 --- a/contract/test_snapshots/test/test_get_schema_version_returns_zero_and_updates.1.json +++ b/contract/test_snapshots/test/test_get_schema_version_returns_zero_and_updates.1.json @@ -1131,4 +1131,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscriber_at_returns_first.1.json b/contract/test_snapshots/test/test_get_subscriber_at_returns_first.1.json index 4184142..3052255 100644 --- a/contract/test_snapshots/test/test_get_subscriber_at_returns_first.1.json +++ b/contract/test_snapshots/test/test_get_subscriber_at_returns_first.1.json @@ -1687,4 +1687,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_label_none_when_not_set.1.json b/contract/test_snapshots/test/test_get_subscription_label_none_when_not_set.1.json index 4486baa..b843f91 100644 --- a/contract/test_snapshots/test/test_get_subscription_label_none_when_not_set.1.json +++ b/contract/test_snapshots/test/test_get_subscription_label_none_when_not_set.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_label_returns_set_value.1.json b/contract/test_snapshots/test/test_get_subscription_label_returns_set_value.1.json index cb40cc6..3c548be 100644 --- a/contract/test_snapshots/test/test_get_subscription_label_returns_set_value.1.json +++ b/contract/test_snapshots/test/test_get_subscription_label_returns_set_value.1.json @@ -1793,4 +1793,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_nonexistent.1.json b/contract/test_snapshots/test/test_get_subscription_nonexistent.1.json index 49af22b..fde4214 100644 --- a/contract/test_snapshots/test/test_get_subscription_nonexistent.1.json +++ b/contract/test_snapshots/test/test_get_subscription_nonexistent.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_token_none_before_subscribe.1.json b/contract/test_snapshots/test/test_get_subscription_token_none_before_subscribe.1.json index 29cbe61..1f987f8 100644 --- a/contract/test_snapshots/test/test_get_subscription_token_none_before_subscribe.1.json +++ b/contract/test_snapshots/test/test_get_subscription_token_none_before_subscribe.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_token_some_after_cancel.1.json b/contract/test_snapshots/test/test_get_subscription_token_some_after_cancel.1.json index df9ef12..aa408bc 100644 --- a/contract/test_snapshots/test/test_get_subscription_token_some_after_cancel.1.json +++ b/contract/test_snapshots/test/test_get_subscription_token_some_after_cancel.1.json @@ -1770,4 +1770,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_token_some_after_subscribe.1.json b/contract/test_snapshots/test/test_get_subscription_token_some_after_subscribe.1.json index 9828d19..6efbf01 100644 --- a/contract/test_snapshots/test/test_get_subscription_token_some_after_subscribe.1.json +++ b/contract/test_snapshots/test/test_get_subscription_token_some_after_subscribe.1.json @@ -1639,4 +1639,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_subscription_token_updates_on_resubscribe.1.json b/contract/test_snapshots/test/test_get_subscription_token_updates_on_resubscribe.1.json index 6b0cf55..f3a66a8 100644 --- a/contract/test_snapshots/test/test_get_subscription_token_updates_on_resubscribe.1.json +++ b/contract/test_snapshots/test/test_get_subscription_token_updates_on_resubscribe.1.json @@ -2741,4 +2741,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_token_returns_initialized_token.1.json b/contract/test_snapshots/test/test_get_token_returns_initialized_token.1.json index cc1d8c2..ad3be1d 100644 --- a/contract/test_snapshots/test/test_get_token_returns_initialized_token.1.json +++ b/contract/test_snapshots/test/test_get_token_returns_initialized_token.1.json @@ -1065,4 +1065,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_token_returns_none_when_not_initialized.1.json b/contract/test_snapshots/test/test_get_token_returns_none_when_not_initialized.1.json index 3baab2b..53ad479 100644 --- a/contract/test_snapshots/test/test_get_token_returns_none_when_not_initialized.1.json +++ b/contract/test_snapshots/test/test_get_token_returns_none_when_not_initialized.1.json @@ -3,7 +3,9 @@ "address": 1, "nonce": 0 }, - "auth": [[]], + "auth": [ + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -116,4 +118,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_trial_end_with_trial_period.1.json b/contract/test_snapshots/test/test_get_trial_end_with_trial_period.1.json index d3ca6d1..d852b25 100644 --- a/contract/test_snapshots/test/test_get_trial_end_with_trial_period.1.json +++ b/contract/test_snapshots/test/test_get_trial_end_with_trial_period.1.json @@ -1643,4 +1643,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_trial_end_without_trial_period.1.json b/contract/test_snapshots/test/test_get_trial_end_without_trial_period.1.json index 67b9210..34c2cbe 100644 --- a/contract/test_snapshots/test/test_get_trial_end_without_trial_period.1.json +++ b/contract/test_snapshots/test/test_get_trial_end_without_trial_period.1.json @@ -1637,4 +1637,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_whitelist_enabled_defaults_to_true.1.json b/contract/test_snapshots/test/test_get_whitelist_enabled_defaults_to_true.1.json index 772c0d2..c8358f0 100644 --- a/contract/test_snapshots/test/test_get_whitelist_enabled_defaults_to_true.1.json +++ b/contract/test_snapshots/test/test_get_whitelist_enabled_defaults_to_true.1.json @@ -3,7 +3,9 @@ "address": 1, "nonce": 0 }, - "auth": [[]], + "auth": [ + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -118,4 +120,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_get_whitelist_enabled_toggles.1.json b/contract/test_snapshots/test/test_get_whitelist_enabled_toggles.1.json index 33d04db..a9c104c 100644 --- a/contract/test_snapshots/test/test_get_whitelist_enabled_toggles.1.json +++ b/contract/test_snapshots/test/test_get_whitelist_enabled_toggles.1.json @@ -440,4 +440,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_accumulator_overflow_fails_with_typed_error.1.json b/contract/test_snapshots/test/test_global_volume_accumulator_overflow_fails_with_typed_error.1.json index 22478f8..a45f47a 100644 --- a/contract/test_snapshots/test/test_global_volume_accumulator_overflow_fails_with_typed_error.1.json +++ b/contract/test_snapshots/test/test_global_volume_accumulator_overflow_fails_with_typed_error.1.json @@ -941,4 +941,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_cap_breach_still_reports_28.1.json b/contract/test_snapshots/test/test_global_volume_cap_breach_still_reports_28.1.json index 2daa834..713570e 100644 --- a/contract/test_snapshots/test/test_global_volume_cap_breach_still_reports_28.1.json +++ b/contract/test_snapshots/test/test_global_volume_cap_breach_still_reports_28.1.json @@ -941,4 +941,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_exceeds_limit.1.json b/contract/test_snapshots/test/test_global_volume_exceeds_limit.1.json index bccd057..1436803 100644 --- a/contract/test_snapshots/test/test_global_volume_exceeds_limit.1.json +++ b/contract/test_snapshots/test/test_global_volume_exceeds_limit.1.json @@ -4006,4 +4006,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_window_end_overflow_fails_with_typed_error.1.json b/contract/test_snapshots/test/test_global_volume_window_end_overflow_fails_with_typed_error.1.json index 22478f8..a45f47a 100644 --- a/contract/test_snapshots/test/test_global_volume_window_end_overflow_fails_with_typed_error.1.json +++ b/contract/test_snapshots/test/test_global_volume_window_end_overflow_fails_with_typed_error.1.json @@ -941,4 +941,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_window_reset.1.json b/contract/test_snapshots/test/test_global_volume_window_reset.1.json index 6fe3684..440037a 100644 --- a/contract/test_snapshots/test/test_global_volume_window_reset.1.json +++ b/contract/test_snapshots/test/test_global_volume_window_reset.1.json @@ -4074,4 +4074,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_global_volume_within_limit.1.json b/contract/test_snapshots/test/test_global_volume_within_limit.1.json index f221fc9..ebb4704 100644 --- a/contract/test_snapshots/test/test_global_volume_within_limit.1.json +++ b/contract/test_snapshots/test/test_global_volume_within_limit.1.json @@ -2229,4 +2229,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_grace_period_commit_expired_proposal_panics.1.json b/contract/test_snapshots/test/test_grace_period_commit_expired_proposal_panics.1.json index 0912ced..96578ba 100644 --- a/contract/test_snapshots/test/test_grace_period_commit_expired_proposal_panics.1.json +++ b/contract/test_snapshots/test/test_grace_period_commit_expired_proposal_panics.1.json @@ -1222,4 +1222,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_grace_period_propose_commit_happy_path.1.json b/contract/test_snapshots/test/test_grace_period_propose_commit_happy_path.1.json index 1727b7d..e433657 100644 --- a/contract/test_snapshots/test/test_grace_period_propose_commit_happy_path.1.json +++ b/contract/test_snapshots/test/test_grace_period_propose_commit_happy_path.1.json @@ -1189,4 +1189,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_grace_period_ttl_extension.1.json b/contract/test_snapshots/test/test_grace_period_ttl_extension.1.json index a61149f..feb1a71 100644 --- a/contract/test_snapshots/test/test_grace_period_ttl_extension.1.json +++ b/contract/test_snapshots/test/test_grace_period_ttl_extension.1.json @@ -1189,4 +1189,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_active_subscription_count.1.json b/contract/test_snapshots/test/test_health_check_active_subscription_count.1.json index 715d3c6..3bccbc0 100644 --- a/contract/test_snapshots/test/test_health_check_active_subscription_count.1.json +++ b/contract/test_snapshots/test/test_health_check_active_subscription_count.1.json @@ -1718,4 +1718,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_healthy_fully_configured.1.json b/contract/test_snapshots/test/test_health_check_healthy_fully_configured.1.json index 4d2b291..192140f 100644 --- a/contract/test_snapshots/test/test_health_check_healthy_fully_configured.1.json +++ b/contract/test_snapshots/test/test_health_check_healthy_fully_configured.1.json @@ -1146,4 +1146,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_initialized_unpaused.1.json b/contract/test_snapshots/test/test_health_check_initialized_unpaused.1.json index 4d2b291..192140f 100644 --- a/contract/test_snapshots/test/test_health_check_initialized_unpaused.1.json +++ b/contract/test_snapshots/test/test_health_check_initialized_unpaused.1.json @@ -1146,4 +1146,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_paused.1.json b/contract/test_snapshots/test/test_health_check_paused.1.json index 29f0d48..0b46821 100644 --- a/contract/test_snapshots/test/test_health_check_paused.1.json +++ b/contract/test_snapshots/test/test_health_check_paused.1.json @@ -1269,4 +1269,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_paused_not_healthy.1.json b/contract/test_snapshots/test/test_health_check_paused_not_healthy.1.json index 29f0d48..0b46821 100644 --- a/contract/test_snapshots/test/test_health_check_paused_not_healthy.1.json +++ b/contract/test_snapshots/test/test_health_check_paused_not_healthy.1.json @@ -1269,4 +1269,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_pre_initialize.1.json b/contract/test_snapshots/test/test_health_check_pre_initialize.1.json index bf1a6f3..9a5cad7 100644 --- a/contract/test_snapshots/test/test_health_check_pre_initialize.1.json +++ b/contract/test_snapshots/test/test_health_check_pre_initialize.1.json @@ -3,7 +3,9 @@ "address": 1, "nonce": 0 }, - "auth": [[]], + "auth": [ + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -199,4 +201,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_ttl_is_positive.1.json b/contract/test_snapshots/test/test_health_check_ttl_is_positive.1.json index 4d2b291..192140f 100644 --- a/contract/test_snapshots/test/test_health_check_ttl_is_positive.1.json +++ b/contract/test_snapshots/test/test_health_check_ttl_is_positive.1.json @@ -1146,4 +1146,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_health_check_unconfigured_not_healthy.1.json b/contract/test_snapshots/test/test_health_check_unconfigured_not_healthy.1.json index bf1a6f3..9a5cad7 100644 --- a/contract/test_snapshots/test/test_health_check_unconfigured_not_healthy.1.json +++ b/contract/test_snapshots/test/test_health_check_unconfigured_not_healthy.1.json @@ -3,7 +3,9 @@ "address": 1, "nonce": 0 }, - "auth": [[]], + "auth": [ + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -199,4 +201,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_initialize_backward_compat.1.json b/contract/test_snapshots/test/test_initialize_backward_compat.1.json index d80e8d4..fa7ff6b 100644 --- a/contract/test_snapshots/test/test_initialize_backward_compat.1.json +++ b/contract/test_snapshots/test/test_initialize_backward_compat.1.json @@ -2659,4 +2659,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_initialize_sets_instance_ttl.1.json b/contract/test_snapshots/test/test_initialize_sets_instance_ttl.1.json index 25a0bbf..c53e28f 100644 --- a/contract/test_snapshots/test/test_initialize_sets_instance_ttl.1.json +++ b/contract/test_snapshots/test/test_initialize_sets_instance_ttl.1.json @@ -519,4 +519,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_initialize_without_valid_token.1.json b/contract/test_snapshots/test/test_initialize_without_valid_token.1.json index ab9d2ee..576b1ed 100644 --- a/contract/test_snapshots/test/test_initialize_without_valid_token.1.json +++ b/contract/test_snapshots/test/test_initialize_without_valid_token.1.json @@ -206,4 +206,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_interval_minimum_valid.1.json b/contract/test_snapshots/test/test_interval_minimum_valid.1.json index e5ca779..6e34831 100644 --- a/contract/test_snapshots/test/test_interval_minimum_valid.1.json +++ b/contract/test_snapshots/test/test_interval_minimum_valid.1.json @@ -2010,4 +2010,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_interval_too_short.1.json b/contract/test_snapshots/test/test_interval_too_short.1.json index 36ccd2d..a257d84 100644 --- a/contract/test_snapshots/test/test_interval_too_short.1.json +++ b/contract/test_snapshots/test/test_interval_too_short.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_charge_due_false_for_paused_subscription.1.json b/contract/test_snapshots/test/test_is_charge_due_false_for_paused_subscription.1.json index dcf64d2..10b8c1a 100644 --- a/contract/test_snapshots/test/test_is_charge_due_false_for_paused_subscription.1.json +++ b/contract/test_snapshots/test/test_is_charge_due_false_for_paused_subscription.1.json @@ -1804,4 +1804,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_charge_due_false_for_unknown_address.1.json b/contract/test_snapshots/test/test_is_charge_due_false_for_unknown_address.1.json index f700937..4743a26 100644 --- a/contract/test_snapshots/test/test_is_charge_due_false_for_unknown_address.1.json +++ b/contract/test_snapshots/test/test_is_charge_due_false_for_unknown_address.1.json @@ -934,4 +934,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_charge_due_false_past_grace_window.1.json b/contract/test_snapshots/test/test_is_charge_due_false_past_grace_window.1.json index 39bb4cf..c74125d 100644 --- a/contract/test_snapshots/test/test_is_charge_due_false_past_grace_window.1.json +++ b/contract/test_snapshots/test/test_is_charge_due_false_past_grace_window.1.json @@ -1896,4 +1896,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_charge_due_transitions_after_interval.1.json b/contract/test_snapshots/test/test_is_charge_due_transitions_after_interval.1.json index ff5e98c..f499e4e 100644 --- a/contract/test_snapshots/test/test_is_charge_due_transitions_after_interval.1.json +++ b/contract/test_snapshots/test/test_is_charge_due_transitions_after_interval.1.json @@ -1689,4 +1689,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_merchant_frozen_reflects_state.1.json b/contract/test_snapshots/test/test_is_merchant_frozen_reflects_state.1.json index cfaabdd..32f6614 100644 --- a/contract/test_snapshots/test/test_is_merchant_frozen_reflects_state.1.json +++ b/contract/test_snapshots/test/test_is_merchant_frozen_reflects_state.1.json @@ -1422,4 +1422,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_is_merchant_whitelisted_returns_false_for_non_whitelisted.1.json b/contract/test_snapshots/test/test_is_merchant_whitelisted_returns_false_for_non_whitelisted.1.json index b018dcf..8b2786c 100644 --- a/contract/test_snapshots/test/test_is_merchant_whitelisted_returns_false_for_non_whitelisted.1.json +++ b/contract/test_snapshots/test/test_is_merchant_whitelisted_returns_false_for_non_whitelisted.1.json @@ -1046,4 +1046,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_max_whitelist_batch_size_defaults_to_50.1.json b/contract/test_snapshots/test/test_max_whitelist_batch_size_defaults_to_50.1.json index b6b6381..f75bff0 100644 --- a/contract/test_snapshots/test/test_max_whitelist_batch_size_defaults_to_50.1.json +++ b/contract/test_snapshots/test/test_max_whitelist_batch_size_defaults_to_50.1.json @@ -1152,4 +1152,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_fee_recipient_cleared_on_remove_and_freeze.1.json b/contract/test_snapshots/test/test_merchant_fee_recipient_cleared_on_remove_and_freeze.1.json index afd6fc5..da8197e 100644 --- a/contract/test_snapshots/test/test_merchant_fee_recipient_cleared_on_remove_and_freeze.1.json +++ b/contract/test_snapshots/test/test_merchant_fee_recipient_cleared_on_remove_and_freeze.1.json @@ -2188,4 +2188,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_fee_recipient_routes_pay_per_use_and_falls_back.1.json b/contract/test_snapshots/test/test_merchant_fee_recipient_routes_pay_per_use_and_falls_back.1.json index 98e4e0d..1d220bc 100644 --- a/contract/test_snapshots/test/test_merchant_fee_recipient_routes_pay_per_use_and_falls_back.1.json +++ b/contract/test_snapshots/test/test_merchant_fee_recipient_routes_pay_per_use_and_falls_back.1.json @@ -3743,4 +3743,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_fee_recipient_routing_and_fallback.1.json b/contract/test_snapshots/test/test_merchant_fee_recipient_routing_and_fallback.1.json index 018f59b..b2f5ba9 100644 --- a/contract/test_snapshots/test/test_merchant_fee_recipient_routing_and_fallback.1.json +++ b/contract/test_snapshots/test/test_merchant_fee_recipient_routing_and_fallback.1.json @@ -3664,4 +3664,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_accumulates.1.json b/contract/test_snapshots/test/test_merchant_revenue_accumulates.1.json index c4aa22a..9f9cfb2 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_accumulates.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_accumulates.1.json @@ -2722,4 +2722,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_from_charge.1.json b/contract/test_snapshots/test/test_merchant_revenue_from_charge.1.json index 0f57674..c8d7449 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_from_charge.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_from_charge.1.json @@ -2335,4 +2335,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_from_pay_per_use.1.json b/contract/test_snapshots/test/test_merchant_revenue_from_pay_per_use.1.json index 5a11208..1735511 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_from_pay_per_use.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_from_pay_per_use.1.json @@ -2384,4 +2384,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_summary_cleared_history.1.json b/contract/test_snapshots/test/test_merchant_revenue_summary_cleared_history.1.json index df02a40..c3c3a21 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_summary_cleared_history.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_summary_cleared_history.1.json @@ -2486,4 +2486,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_summary_empty.1.json b/contract/test_snapshots/test/test_merchant_revenue_summary_empty.1.json index 0bce422..7273553 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_summary_empty.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_summary_empty.1.json @@ -959,4 +959,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_revenue_summary_single_and_multiple_charges.1.json b/contract/test_snapshots/test/test_merchant_revenue_summary_single_and_multiple_charges.1.json index 496efdb..de01baa 100644 --- a/contract/test_snapshots/test/test_merchant_revenue_summary_single_and_multiple_charges.1.json +++ b/contract/test_snapshots/test/test_merchant_revenue_summary_single_and_multiple_charges.1.json @@ -3133,4 +3133,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_sub_count_double_cancel_no_underflow.1.json b/contract/test_snapshots/test/test_merchant_sub_count_double_cancel_no_underflow.1.json index 9c5d1d3..a0124d4 100644 --- a/contract/test_snapshots/test/test_merchant_sub_count_double_cancel_no_underflow.1.json +++ b/contract/test_snapshots/test/test_merchant_sub_count_double_cancel_no_underflow.1.json @@ -2001,4 +2001,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_sub_count_never_subscribed_returns_zero.1.json b/contract/test_snapshots/test/test_merchant_sub_count_never_subscribed_returns_zero.1.json index 7cc9e94..0b1e35d 100644 --- a/contract/test_snapshots/test/test_merchant_sub_count_never_subscribed_returns_zero.1.json +++ b/contract/test_snapshots/test/test_merchant_sub_count_never_subscribed_returns_zero.1.json @@ -934,4 +934,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_sub_count_resubscribe_different_merchant.1.json b/contract/test_snapshots/test/test_merchant_sub_count_resubscribe_different_merchant.1.json index e0a8873..9d77a7d 100644 --- a/contract/test_snapshots/test/test_merchant_sub_count_resubscribe_different_merchant.1.json +++ b/contract/test_snapshots/test/test_merchant_sub_count_resubscribe_different_merchant.1.json @@ -2179,4 +2179,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_merchant_sub_count_two_users_cancel_one.1.json b/contract/test_snapshots/test/test_merchant_sub_count_two_users_cancel_one.1.json index ba3b5d4..8ed875e 100644 --- a/contract/test_snapshots/test/test_merchant_sub_count_two_users_cancel_one.1.json +++ b/contract/test_snapshots/test/test_merchant_sub_count_two_users_cancel_one.1.json @@ -2835,4 +2835,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_admin_success.1.json b/contract/test_snapshots/test/test_migrate_admin_success.1.json new file mode 100644 index 0000000..ca266af --- /dev/null +++ b/contract/test_snapshots/test/test_migrate_admin_success.1.json @@ -0,0 +1,1086 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "migrate", + "args": [ + { + "vec": [] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SchemaVersion" + } + ] + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "migrate" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "migration_completed" + } + ], + "data": { + "vec": [ + { + "u32": 3 + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "migrate" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_schema_version" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_schema_version" + } + ], + "data": { + "u32": 3 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_emits_completed_event_with_version_and_count.1.json b/contract/test_snapshots/test/test_migrate_emits_completed_event_with_version_and_count.1.json index a57a61e..4ddd88a 100644 --- a/contract/test_snapshots/test/test_migrate_emits_completed_event_with_version_and_count.1.json +++ b/contract/test_snapshots/test/test_migrate_emits_completed_event_with_version_and_count.1.json @@ -1749,4 +1749,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_is_idempotent.1.json b/contract/test_snapshots/test/test_migrate_is_idempotent.1.json index 02d4a2c..3772623 100644 --- a/contract/test_snapshots/test/test_migrate_is_idempotent.1.json +++ b/contract/test_snapshots/test/test_migrate_is_idempotent.1.json @@ -1182,4 +1182,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_no_admin_panics.1.json b/contract/test_snapshots/test/test_migrate_no_admin_panics.1.json new file mode 100644 index 0000000..14a8f94 --- /dev/null +++ b/contract/test_snapshots/test/test_migrate_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "migrate" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(migrate)'" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "migrate" + }, + { + "vec": [ + { + "vec": [] + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_non_admin_panics.1.json b/contract/test_snapshots/test/test_migrate_non_admin_panics.1.json index ee07a7e..efd8c1a 100644 --- a/contract/test_snapshots/test/test_migrate_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_migrate_non_admin_panics.1.json @@ -1078,4 +1078,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_sets_schema_version.1.json b/contract/test_snapshots/test/test_migrate_sets_schema_version.1.json index a2435d6..e3da239 100644 --- a/contract/test_snapshots/test/test_migrate_sets_schema_version.1.json +++ b/contract/test_snapshots/test/test_migrate_sets_schema_version.1.json @@ -1131,4 +1131,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migrate_v1_to_v2.1.json b/contract/test_snapshots/test/test_migrate_v1_to_v2.1.json index 9db4305..a468869 100644 --- a/contract/test_snapshots/test/test_migrate_v1_to_v2.1.json +++ b/contract/test_snapshots/test/test_migrate_v1_to_v2.1.json @@ -1319,4 +1319,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_migration_v2_to_v3_populates_referrer.1.json b/contract/test_snapshots/test/test_migration_v2_to_v3_populates_referrer.1.json index 7ecea25..3e7da5a 100644 --- a/contract/test_snapshots/test/test_migration_v2_to_v3_populates_referrer.1.json +++ b/contract/test_snapshots/test/test_migration_v2_to_v3_populates_referrer.1.json @@ -2216,4 +2216,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_min_interval_event_emitted_on_set.1.json b/contract/test_snapshots/test/test_min_interval_event_emitted_on_set.1.json index 5932a8b..e1c1299 100644 --- a/contract/test_snapshots/test/test_min_interval_event_emitted_on_set.1.json +++ b/contract/test_snapshots/test/test_min_interval_event_emitted_on_set.1.json @@ -81,7 +81,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [], [ [ @@ -448,6 +466,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -1508,4 +1559,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_multi_token_independent_subscriptions.1.json b/contract/test_snapshots/test/test_multi_token_independent_subscriptions.1.json index 801cdcc..23d67f5 100644 --- a/contract/test_snapshots/test/test_multi_token_independent_subscriptions.1.json +++ b/contract/test_snapshots/test/test_multi_token_independent_subscriptions.1.json @@ -4197,4 +4197,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_multiple_users.1.json b/contract/test_snapshots/test/test_multiple_users.1.json index 9b0aad5..e3968dc 100644 --- a/contract/test_snapshots/test/test_multiple_users.1.json +++ b/contract/test_snapshots/test/test_multiple_users.1.json @@ -3329,4 +3329,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_next_charge_at_none_after_cancel.1.json b/contract/test_snapshots/test/test_next_charge_at_none_after_cancel.1.json index 3800491..96e2fa5 100644 --- a/contract/test_snapshots/test/test_next_charge_at_none_after_cancel.1.json +++ b/contract/test_snapshots/test/test_next_charge_at_none_after_cancel.1.json @@ -1768,4 +1768,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_next_charge_at_none_for_paused_subscription.1.json b/contract/test_snapshots/test/test_next_charge_at_none_for_paused_subscription.1.json index c50fe6b..fb36110 100644 --- a/contract/test_snapshots/test/test_next_charge_at_none_for_paused_subscription.1.json +++ b/contract/test_snapshots/test/test_next_charge_at_none_for_paused_subscription.1.json @@ -1802,4 +1802,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_next_charge_at_none_for_unknown_address.1.json b/contract/test_snapshots/test/test_next_charge_at_none_for_unknown_address.1.json index a879f89..bb608ca 100644 --- a/contract/test_snapshots/test/test_next_charge_at_none_for_unknown_address.1.json +++ b/contract/test_snapshots/test/test_next_charge_at_none_for_unknown_address.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_next_charge_at_returns_correct_timestamp.1.json b/contract/test_snapshots/test/test_next_charge_at_returns_correct_timestamp.1.json index bff7dba..d9da788 100644 --- a/contract/test_snapshots/test/test_next_charge_at_returns_correct_timestamp.1.json +++ b/contract/test_snapshots/test/test_next_charge_at_returns_correct_timestamp.1.json @@ -1779,4 +1779,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_no_referral_returns_none.1.json b/contract/test_snapshots/test/test_no_referral_returns_none.1.json index be95241..f2cfd07 100644 --- a/contract/test_snapshots/test/test_no_referral_returns_none.1.json +++ b/contract/test_snapshots/test/test_no_referral_returns_none.1.json @@ -1637,4 +1637,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_non_admin_add_and_remove_merchant_panics.1.json b/contract/test_snapshots/test/test_non_admin_add_and_remove_merchant_panics.1.json index 2018799..41318b2 100644 --- a/contract/test_snapshots/test/test_non_admin_add_and_remove_merchant_panics.1.json +++ b/contract/test_snapshots/test/test_non_admin_add_and_remove_merchant_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_non_admin_set_grace_period_panics.1.json b/contract/test_snapshots/test/test_non_admin_set_grace_period_panics.1.json index 12c07b4..cea1949 100644 --- a/contract/test_snapshots/test/test_non_admin_set_grace_period_panics.1.json +++ b/contract/test_snapshots/test/test_non_admin_set_grace_period_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_non_admin_set_max_batch_size_panics.1.json b/contract/test_snapshots/test/test_non_admin_set_max_batch_size_panics.1.json index e0aee7f..ff51a2c 100644 --- a/contract/test_snapshots/test/test_non_admin_set_max_batch_size_panics.1.json +++ b/contract/test_snapshots/test/test_non_admin_set_max_batch_size_panics.1.json @@ -1027,4 +1027,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_old_admin_loses_access_after_transfer.1.json b/contract/test_snapshots/test/test_old_admin_loses_access_after_transfer.1.json index c00d48d..9471650 100644 --- a/contract/test_snapshots/test/test_old_admin_loses_access_after_transfer.1.json +++ b/contract/test_snapshots/test/test_old_admin_loses_access_after_transfer.1.json @@ -1117,4 +1117,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_contract_admin_success.1.json b/contract/test_snapshots/test/test_pause_contract_admin_success.1.json new file mode 100644 index 0000000..7901481 --- /dev/null +++ b/contract/test_snapshots/test/test_pause_contract_admin_success.1.json @@ -0,0 +1,1071 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "pause_contract", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "pause_contract" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "contract_paused" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "pause_contract" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "is_contract_paused" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "is_contract_paused" + } + ], + "data": { + "bool": true + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_contract_no_admin_panics.1.json b/contract/test_snapshots/test/test_pause_contract_no_admin_panics.1.json new file mode 100644 index 0000000..181e7db --- /dev/null +++ b/contract/test_snapshots/test/test_pause_contract_no_admin_panics.1.json @@ -0,0 +1,992 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "pause_contract" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "pause_contract" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_on_inactive_subscription_panics.1.json b/contract/test_snapshots/test/test_pause_on_inactive_subscription_panics.1.json index 37347f7..0daf515 100644 --- a/contract/test_snapshots/test/test_pause_on_inactive_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_pause_on_inactive_subscription_panics.1.json @@ -1893,4 +1893,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_sets_paused_true.1.json b/contract/test_snapshots/test/test_pause_sets_paused_true.1.json index f6cec2e..4e0246f 100644 --- a/contract/test_snapshots/test/test_pause_sets_paused_true.1.json +++ b/contract/test_snapshots/test/test_pause_sets_paused_true.1.json @@ -1894,4 +1894,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_then_batch_extend_then_auto_resume.1.json b/contract/test_snapshots/test/test_pause_then_batch_extend_then_auto_resume.1.json index d74bccf..cf8c81e 100644 --- a/contract/test_snapshots/test/test_pause_then_batch_extend_then_auto_resume.1.json +++ b/contract/test_snapshots/test/test_pause_then_batch_extend_then_auto_resume.1.json @@ -2651,4 +2651,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_until_auto_resume_on_batch_charge_and_clears_expiry.1.json b/contract/test_snapshots/test/test_pause_until_auto_resume_on_batch_charge_and_clears_expiry.1.json index e0ca6ea..60e8937 100644 --- a/contract/test_snapshots/test/test_pause_until_auto_resume_on_batch_charge_and_clears_expiry.1.json +++ b/contract/test_snapshots/test/test_pause_until_auto_resume_on_batch_charge_and_clears_expiry.1.json @@ -2594,4 +2594,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_until_auto_resume_on_charge.1.json b/contract/test_snapshots/test/test_pause_until_auto_resume_on_charge.1.json index b20fdc1..72ddf76 100644 --- a/contract/test_snapshots/test/test_pause_until_auto_resume_on_charge.1.json +++ b/contract/test_snapshots/test/test_pause_until_auto_resume_on_charge.1.json @@ -2721,4 +2721,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pause_until_invalid_expiry_panics.1.json b/contract/test_snapshots/test/test_pause_until_invalid_expiry_panics.1.json index b88d1a9..114227e 100644 --- a/contract/test_snapshots/test/test_pause_until_invalid_expiry_panics.1.json +++ b/contract/test_snapshots/test/test_pause_until_invalid_expiry_panics.1.json @@ -1905,4 +1905,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use.1.json b/contract/test_snapshots/test/test_pay_per_use.1.json index 916bd33..dd2df73 100644 --- a/contract/test_snapshots/test/test_pay_per_use.1.json +++ b/contract/test_snapshots/test/test_pay_per_use.1.json @@ -2437,4 +2437,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_allowance_below_gross_fails_closed.1.json b/contract/test_snapshots/test/test_pay_per_use_allowance_below_gross_fails_closed.1.json index 8b4946f..d9fa4e0 100644 --- a/contract/test_snapshots/test/test_pay_per_use_allowance_below_gross_fails_closed.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_allowance_below_gross_fails_closed.1.json @@ -2375,4 +2375,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_applies_protocol_fee_and_records_net_revenue.1.json b/contract/test_snapshots/test/test_pay_per_use_applies_protocol_fee_and_records_net_revenue.1.json index 06a5959..ac2564c 100644 --- a/contract/test_snapshots/test/test_pay_per_use_applies_protocol_fee_and_records_net_revenue.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_applies_protocol_fee_and_records_net_revenue.1.json @@ -3072,4 +3072,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_does_not_update_last_charged.1.json b/contract/test_snapshots/test/test_pay_per_use_does_not_update_last_charged.1.json index 23fe404..a8c5c2a 100644 --- a/contract/test_snapshots/test/test_pay_per_use_does_not_update_last_charged.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_does_not_update_last_charged.1.json @@ -2611,4 +2611,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_exact_gross_allowance_succeeds_with_fee.1.json b/contract/test_snapshots/test/test_pay_per_use_exact_gross_allowance_succeeds_with_fee.1.json index 5c355ae..28e6819 100644 --- a/contract/test_snapshots/test/test_pay_per_use_exact_gross_allowance_succeeds_with_fee.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_exact_gross_allowance_succeeds_with_fee.1.json @@ -3139,4 +3139,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_exceeds_cap.1.json b/contract/test_snapshots/test/test_pay_per_use_exceeds_cap.1.json index 1622e07..779f233 100644 --- a/contract/test_snapshots/test/test_pay_per_use_exceeds_cap.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_exceeds_cap.1.json @@ -1778,4 +1778,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_inactive.1.json b/contract/test_snapshots/test/test_pay_per_use_inactive.1.json index f53b97b..771747a 100644 --- a/contract/test_snapshots/test/test_pay_per_use_inactive.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_inactive.1.json @@ -1909,4 +1909,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_nonexistent.1.json b/contract/test_snapshots/test/test_pay_per_use_nonexistent.1.json index dc53ca4..2a2ce58 100644 --- a/contract/test_snapshots/test/test_pay_per_use_nonexistent.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_nonexistent.1.json @@ -1073,4 +1073,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_on_paused_subscription_panics.1.json b/contract/test_snapshots/test/test_pay_per_use_on_paused_subscription_panics.1.json index 4e2739f..fc5ccfb 100644 --- a/contract/test_snapshots/test/test_pay_per_use_on_paused_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_on_paused_subscription_panics.1.json @@ -1943,4 +1943,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_succeeds_after_merchant_frozen.1.json b/contract/test_snapshots/test/test_pay_per_use_succeeds_after_merchant_frozen.1.json index ffd86fa..565ef58 100644 --- a/contract/test_snapshots/test/test_pay_per_use_succeeds_after_merchant_frozen.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_succeeds_after_merchant_frozen.1.json @@ -2568,4 +2568,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_applies_protocol_fee_to_recipient.1.json b/contract/test_snapshots/test/test_pay_per_use_to_applies_protocol_fee_to_recipient.1.json index b9c2ee7..9934ec6 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_applies_protocol_fee_to_recipient.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_applies_protocol_fee_to_recipient.1.json @@ -3078,4 +3078,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_contract_address_panics.1.json b/contract/test_snapshots/test/test_pay_per_use_to_contract_address_panics.1.json index b1fcad7..705a868 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_contract_address_panics.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_contract_address_panics.1.json @@ -1784,4 +1784,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_daily_limit_shared_with_pay_per_use.1.json b/contract/test_snapshots/test/test_pay_per_use_to_daily_limit_shared_with_pay_per_use.1.json index dc62660..db9d4cb 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_daily_limit_shared_with_pay_per_use.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_daily_limit_shared_with_pay_per_use.1.json @@ -2715,4 +2715,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use.1.json b/contract/test_snapshots/test/test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use.1.json index 560e168..ea2e109 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_recipient_equals_merchant_behaves_like_pay_per_use.1.json @@ -2496,4 +2496,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_rejects_non_whitelisted_recipient.1.json b/contract/test_snapshots/test/test_pay_per_use_to_rejects_non_whitelisted_recipient.1.json index 528947c..fe20b0a 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_rejects_non_whitelisted_recipient.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_rejects_non_whitelisted_recipient.1.json @@ -2145,4 +2145,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_transfers_to_recipient_not_merchant.1.json b/contract/test_snapshots/test/test_pay_per_use_to_transfers_to_recipient_not_merchant.1.json index 55c765f..f4f9ef5 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_transfers_to_recipient_not_merchant.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_transfers_to_recipient_not_merchant.1.json @@ -2655,4 +2655,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient.1.json b/contract/test_snapshots/test/test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient.1.json index 86b290d..25df6c9 100644 --- a/contract/test_snapshots/test/test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_to_zero_fee_bps_full_amount_to_recipient.1.json @@ -2443,4 +2443,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_with_zero_fee_bps_transfers_full_amount.1.json b/contract/test_snapshots/test/test_pay_per_use_with_zero_fee_bps_transfers_full_amount.1.json index 837bf38..808fa6e 100644 --- a/contract/test_snapshots/test/test_pay_per_use_with_zero_fee_bps_transfers_full_amount.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_with_zero_fee_bps_transfers_full_amount.1.json @@ -2836,4 +2836,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_pay_per_use_zero_amount.1.json b/contract/test_snapshots/test/test_pay_per_use_zero_amount.1.json index 59796a8..faefcec 100644 --- a/contract/test_snapshots/test/test_pay_per_use_zero_amount.1.json +++ b/contract/test_snapshots/test/test_pay_per_use_zero_amount.1.json @@ -1778,4 +1778,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_and_commit_fee_sets_fee.1.json b/contract/test_snapshots/test/test_propose_and_commit_fee_sets_fee.1.json index 7ab5b50..981c45a 100644 --- a/contract/test_snapshots/test/test_propose_and_commit_fee_sets_fee.1.json +++ b/contract/test_snapshots/test/test_propose_and_commit_fee_sets_fee.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_admin_success.1.json b/contract/test_snapshots/test/test_propose_fee_admin_success.1.json new file mode 100644 index 0000000..f37ae52 --- /dev/null +++ b/contract/test_snapshots/test/test_propose_fee_admin_success.1.json @@ -0,0 +1,1128 @@ +{ + "generators": { + "address": 7, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "propose_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "PendingFee" + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "PendingFee" + } + ] + }, + "durability": "temporary", + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 100 + } + ] + } + } + }, + "ext": "v0" + }, + 17280 + ] + ], + [ + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "propose_fee" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "fee_proposed" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_fee" + } + ], + "data": "void" + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_emits_fee_proposed_event.1.json b/contract/test_snapshots/test/test_propose_fee_emits_fee_proposed_event.1.json index 03c5c60..6c67180 100644 --- a/contract/test_snapshots/test/test_propose_fee_emits_fee_proposed_event.1.json +++ b/contract/test_snapshots/test/test_propose_fee_emits_fee_proposed_event.1.json @@ -1079,4 +1079,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_invalid_bps_panics.1.json b/contract/test_snapshots/test/test_propose_fee_invalid_bps_panics.1.json index ef942da..770d830 100644 --- a/contract/test_snapshots/test/test_propose_fee_invalid_bps_panics.1.json +++ b/contract/test_snapshots/test/test_propose_fee_invalid_bps_panics.1.json @@ -1080,4 +1080,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_max_valid_bps.1.json b/contract/test_snapshots/test/test_propose_fee_max_valid_bps.1.json index 6780b1a..18623c5 100644 --- a/contract/test_snapshots/test/test_propose_fee_max_valid_bps.1.json +++ b/contract/test_snapshots/test/test_propose_fee_max_valid_bps.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_no_admin_panics.1.json b/contract/test_snapshots/test/test_propose_fee_no_admin_panics.1.json new file mode 100644 index 0000000..ab4effb --- /dev/null +++ b/contract/test_snapshots/test/test_propose_fee_no_admin_panics.1.json @@ -0,0 +1,1018 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "propose_fee" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#221)'" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "propose_fee" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u32": 100 + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_non_admin_panics.1.json b/contract/test_snapshots/test/test_propose_fee_non_admin_panics.1.json index 43bdfef..9c2c6da 100644 --- a/contract/test_snapshots/test/test_propose_fee_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_propose_fee_non_admin_panics.1.json @@ -1040,4 +1040,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_propose_fee_zero_bps_valid.1.json b/contract/test_snapshots/test/test_propose_fee_zero_bps_valid.1.json index 9a75ca8..27d9f05 100644 --- a/contract/test_snapshots/test/test_propose_fee_zero_bps_valid.1.json +++ b/contract/test_snapshots/test/test_propose_fee_zero_bps_valid.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_protocol_fee_accrual_overflow_fails_with_typed_error.1.json b/contract/test_snapshots/test/test_protocol_fee_accrual_overflow_fails_with_typed_error.1.json index 1b6c9cf..2b2583e 100644 --- a/contract/test_snapshots/test/test_protocol_fee_accrual_overflow_fails_with_typed_error.1.json +++ b/contract/test_snapshots/test/test_protocol_fee_accrual_overflow_fails_with_typed_error.1.json @@ -2200,4 +2200,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_raised_whitelist_batch_cap_allows_more_than_default.1.json b/contract/test_snapshots/test/test_raised_whitelist_batch_cap_allows_more_than_default.1.json index d4984f9..4acf6f6 100644 --- a/contract/test_snapshots/test/test_raised_whitelist_batch_cap_allows_more_than_default.1.json +++ b/contract/test_snapshots/test/test_raised_whitelist_batch_cap_allows_more_than_default.1.json @@ -11794,4 +11794,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_referral_cleared_on_cancel.1.json b/contract/test_snapshots/test/test_referral_cleared_on_cancel.1.json index c1058c1..e84c6de 100644 --- a/contract/test_snapshots/test/test_referral_cleared_on_cancel.1.json +++ b/contract/test_snapshots/test/test_referral_cleared_on_cancel.1.json @@ -1847,4 +1847,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_referral_clears_on_resubscribe_with_none.1.json b/contract/test_snapshots/test/test_referral_clears_on_resubscribe_with_none.1.json index 5f04239..6eb07a4 100644 --- a/contract/test_snapshots/test/test_referral_clears_on_resubscribe_with_none.1.json +++ b/contract/test_snapshots/test/test_referral_clears_on_resubscribe_with_none.1.json @@ -1969,4 +1969,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_referral_stored_on_subscribe.1.json b/contract/test_snapshots/test/test_referral_stored_on_subscribe.1.json index ae6b941..4f80b5b 100644 --- a/contract/test_snapshots/test/test_referral_stored_on_subscribe.1.json +++ b/contract/test_snapshots/test/test_referral_stored_on_subscribe.1.json @@ -1713,4 +1713,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_referral_updates_on_resubscribe.1.json b/contract/test_snapshots/test/test_referral_updates_on_resubscribe.1.json index dd2e8fe..b6a4fdc 100644 --- a/contract/test_snapshots/test/test_referral_updates_on_resubscribe.1.json +++ b/contract/test_snapshots/test/test_referral_updates_on_resubscribe.1.json @@ -2045,4 +2045,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_remove_daily_limit_allows_pay_per_use_after_removal.1.json b/contract/test_snapshots/test/test_remove_daily_limit_allows_pay_per_use_after_removal.1.json index 3c409e5..863d1b7 100644 --- a/contract/test_snapshots/test/test_remove_daily_limit_allows_pay_per_use_after_removal.1.json +++ b/contract/test_snapshots/test/test_remove_daily_limit_allows_pay_per_use_after_removal.1.json @@ -2939,4 +2939,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_repropose_before_commit_applies_latest.1.json b/contract/test_snapshots/test/test_repropose_before_commit_applies_latest.1.json index 5de548e..78b3de5 100644 --- a/contract/test_snapshots/test/test_repropose_before_commit_applies_latest.1.json +++ b/contract/test_snapshots/test/test_repropose_before_commit_applies_latest.1.json @@ -1368,4 +1368,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resubscribe.1.json b/contract/test_snapshots/test/test_resubscribe.1.json index d1b6f9e..5497a2b 100644 --- a/contract/test_snapshots/test/test_resubscribe.1.json +++ b/contract/test_snapshots/test/test_resubscribe.1.json @@ -2259,4 +2259,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resubscribe_active_does_not_duplicate_index.1.json b/contract/test_snapshots/test/test_resubscribe_active_does_not_duplicate_index.1.json index 89f42c4..99f0330 100644 --- a/contract/test_snapshots/test/test_resubscribe_active_does_not_duplicate_index.1.json +++ b/contract/test_snapshots/test/test_resubscribe_active_does_not_duplicate_index.1.json @@ -2001,4 +2001,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resubscribe_zero_allowance_panics.1.json b/contract/test_snapshots/test/test_resubscribe_zero_allowance_panics.1.json index 30b0b31..df8fa5a 100644 --- a/contract/test_snapshots/test/test_resubscribe_zero_allowance_panics.1.json +++ b/contract/test_snapshots/test/test_resubscribe_zero_allowance_panics.1.json @@ -2155,4 +2155,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resume_after_grace_lapse_panics.1.json b/contract/test_snapshots/test/test_resume_after_grace_lapse_panics.1.json index aef639a..6d438ef 100644 --- a/contract/test_snapshots/test/test_resume_after_grace_lapse_panics.1.json +++ b/contract/test_snapshots/test/test_resume_after_grace_lapse_panics.1.json @@ -23,6 +23,7 @@ } ] ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", @@ -680,6 +681,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" @@ -2041,7 +2050,7 @@ }, { "error": { - "contract": 35 + "contract": 100 } } ], @@ -2051,7 +2060,7 @@ "string": "failing with contract error" }, { - "u32": 35 + "u32": 100 } ] } @@ -2073,7 +2082,7 @@ }, { "error": { - "contract": 35 + "contract": 100 } } ], @@ -2098,7 +2107,7 @@ }, { "error": { - "contract": 35 + "contract": 100 } } ], @@ -2123,7 +2132,7 @@ }, { "error": { - "contract": 35 + "contract": 100 } } ], @@ -2162,7 +2171,7 @@ }, { "error": { - "contract": 35 + "contract": 100 } } ], diff --git a/contract/test_snapshots/test/test_resume_clears_pause_expiry.1.json b/contract/test_snapshots/test/test_resume_clears_pause_expiry.1.json index dbabebb..e42286e 100644 --- a/contract/test_snapshots/test/test_resume_clears_pause_expiry.1.json +++ b/contract/test_snapshots/test/test_resume_clears_pause_expiry.1.json @@ -1980,4 +1980,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resume_no_grace_period_always_succeeds.1.json b/contract/test_snapshots/test/test_resume_no_grace_period_always_succeeds.1.json index 551bf15..1cbcf1b 100644 --- a/contract/test_snapshots/test/test_resume_no_grace_period_always_succeeds.1.json +++ b/contract/test_snapshots/test/test_resume_no_grace_period_always_succeeds.1.json @@ -23,6 +23,7 @@ } ] ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", @@ -619,6 +620,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" @@ -1882,6 +1891,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" diff --git a/contract/test_snapshots/test/test_resume_unpauses_and_charge_succeeds.1.json b/contract/test_snapshots/test/test_resume_unpauses_and_charge_succeeds.1.json index 38dcb36..12756b6 100644 --- a/contract/test_snapshots/test/test_resume_unpauses_and_charge_succeeds.1.json +++ b/contract/test_snapshots/test/test_resume_unpauses_and_charge_succeeds.1.json @@ -2609,4 +2609,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_resume_within_grace_window_succeeds.1.json b/contract/test_snapshots/test/test_resume_within_grace_window_succeeds.1.json index a20d271..a63858e 100644 --- a/contract/test_snapshots/test/test_resume_within_grace_window_succeeds.1.json +++ b/contract/test_snapshots/test/test_resume_within_grace_window_succeeds.1.json @@ -23,6 +23,7 @@ } ] ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", @@ -654,6 +655,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" @@ -2139,6 +2148,14 @@ } } }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "interval" diff --git a/contract/test_snapshots/test/test_self_referral_rejected_via_try_subscribe.1.json b/contract/test_snapshots/test/test_self_referral_rejected_via_try_subscribe.1.json index 55686ac..872e6b1 100644 --- a/contract/test_snapshots/test/test_self_referral_rejected_via_try_subscribe.1.json +++ b/contract/test_snapshots/test/test_self_referral_rejected_via_try_subscribe.1.json @@ -1133,4 +1133,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_and_get_merchant_fee_recipient.1.json b/contract/test_snapshots/test/test_set_and_get_merchant_fee_recipient.1.json index db8a6fc..9de4ae6 100644 --- a/contract/test_snapshots/test/test_set_and_get_merchant_fee_recipient.1.json +++ b/contract/test_snapshots/test/test_set_and_get_merchant_fee_recipient.1.json @@ -1159,4 +1159,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_and_get_metadata.1.json b/contract/test_snapshots/test/test_set_and_get_metadata.1.json index dfebca0..a39efa9 100644 --- a/contract/test_snapshots/test/test_set_and_get_metadata.1.json +++ b/contract/test_snapshots/test/test_set_and_get_metadata.1.json @@ -1793,4 +1793,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_fee_emits_event.1.json b/contract/test_snapshots/test/test_set_fee_emits_event.1.json index 52e1a93..b15c100 100644 --- a/contract/test_snapshots/test/test_set_fee_emits_event.1.json +++ b/contract/test_snapshots/test/test_set_fee_emits_event.1.json @@ -1177,4 +1177,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_fee_invalid_bps_panics.1.json b/contract/test_snapshots/test/test_set_fee_invalid_bps_panics.1.json index ef942da..770d830 100644 --- a/contract/test_snapshots/test/test_set_fee_invalid_bps_panics.1.json +++ b/contract/test_snapshots/test/test_set_fee_invalid_bps_panics.1.json @@ -1080,4 +1080,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_global_volume_cap_admin_success.1.json b/contract/test_snapshots/test/test_set_global_volume_cap_admin_success.1.json new file mode 100644 index 0000000..8fdc41d --- /dev/null +++ b/contract/test_snapshots/test/test_set_global_volume_cap_admin_success.1.json @@ -0,0 +1,1071 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_global_volume_cap", + "args": [ + { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "GlobalVolumeCapOverride" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_global_volume_cap" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_global_volume_cap" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_global_volume_cap" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_global_volume_cap" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_global_volume_cap_no_admin_panics.1.json b/contract/test_snapshots/test/test_set_global_volume_cap_no_admin_panics.1.json new file mode 100644 index 0000000..f7765a2 --- /dev/null +++ b/contract/test_snapshots/test/test_set_global_volume_cap_no_admin_panics.1.json @@ -0,0 +1,1014 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_global_volume_cap" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + }, + { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_global_volume_cap" + }, + { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 1000000000 + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_grace_period_emits_event.1.json b/contract/test_snapshots/test/test_set_grace_period_emits_event.1.json index 800b6af..d7bba7d 100644 --- a/contract/test_snapshots/test/test_set_grace_period_emits_event.1.json +++ b/contract/test_snapshots/test/test_set_grace_period_emits_event.1.json @@ -1141,4 +1141,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_initial_admin_second_call_returns_typed_error.1.json b/contract/test_snapshots/test/test_set_initial_admin_second_call_returns_typed_error.1.json new file mode 100644 index 0000000..bc090fe --- /dev/null +++ b/contract/test_snapshots/test/test_set_initial_admin_second_call_returns_typed_error.1.json @@ -0,0 +1,1242 @@ +{ + "generators": { + "address": 7, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 42 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_initial_admin" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_initial_admin_success_once.1.json b/contract/test_snapshots/test/test_set_initial_admin_success_once.1.json new file mode 100644 index 0000000..ed9ce42 --- /dev/null +++ b/contract/test_snapshots/test/test_set_initial_admin_success_once.1.json @@ -0,0 +1,1092 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_initial_admin_token_present_admin_missing.1.json b/contract/test_snapshots/test/test_set_initial_admin_token_present_admin_missing.1.json new file mode 100644 index 0000000..d9ade43 --- /dev/null +++ b/contract/test_snapshots/test/test_set_initial_admin_token_present_admin_missing.1.json @@ -0,0 +1,1397 @@ +{ + "generators": { + "address": 7, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_token" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_token" + } + ], + "data": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_token" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_token" + } + ], + "data": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 42 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 42 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_initial_admin" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_initial_admin_unauthenticated_fails.1.json b/contract/test_snapshots/test/test_set_initial_admin_unauthenticated_fails.1.json new file mode 100644 index 0000000..9aa9a4d --- /dev/null +++ b/contract/test_snapshots/test/test_set_initial_admin_unauthenticated_fails.1.json @@ -0,0 +1,1081 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_initial_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "Unauthorized function call for address" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "invalid_action" + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_initial_admin" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_batch_size_admin_success.1.json b/contract/test_snapshots/test/test_set_max_batch_size_admin_success.1.json new file mode 100644 index 0000000..4fba1fb --- /dev/null +++ b/contract/test_snapshots/test/test_set_max_batch_size_admin_success.1.json @@ -0,0 +1,1059 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_max_batch_size", + "args": [ + { + "u32": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "MaxBatchSize" + } + ] + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": { + "u32": 100 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_max_batch_size" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_max_batch_size" + } + ], + "data": { + "u32": 100 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_batch_size_no_admin_panics.1.json b/contract/test_snapshots/test/test_set_max_batch_size_no_admin_panics.1.json new file mode 100644 index 0000000..e3d570b --- /dev/null +++ b/contract/test_snapshots/test/test_set_max_batch_size_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_max_batch_size" + } + ], + "data": { + "u32": 100 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + }, + { + "u32": 100 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_max_batch_size" + }, + { + "vec": [ + { + "u32": 100 + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_batch_size_rejects_value_above_200.1.json b/contract/test_snapshots/test/test_set_max_batch_size_rejects_value_above_200.1.json index a4c4b5c..56938ad 100644 --- a/contract/test_snapshots/test/test_set_max_batch_size_rejects_value_above_200.1.json +++ b/contract/test_snapshots/test/test_set_max_batch_size_rejects_value_above_200.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_above_ceiling_panics.1.json b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_above_ceiling_panics.1.json index 783234e..f69b041 100644 --- a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_above_ceiling_panics.1.json +++ b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_above_ceiling_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_lowers_cap.1.json b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_lowers_cap.1.json index 956e421..fae2e16 100644 --- a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_lowers_cap.1.json +++ b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_lowers_cap.1.json @@ -1651,4 +1651,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_non_admin_panics.1.json b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_non_admin_panics.1.json index 11bfbe3..61086c8 100644 --- a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_non_admin_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_zero_panics.1.json b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_zero_panics.1.json index 4ae9826..b21487b 100644 --- a/contract/test_snapshots/test/test_set_max_whitelist_batch_size_zero_panics.1.json +++ b/contract/test_snapshots/test/test_set_max_whitelist_batch_size_zero_panics.1.json @@ -1070,4 +1070,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_merchant_fee_recipient_contract_address_panics.1.json b/contract/test_snapshots/test/test_set_merchant_fee_recipient_contract_address_panics.1.json index 732f973..234e287 100644 --- a/contract/test_snapshots/test/test_set_merchant_fee_recipient_contract_address_panics.1.json +++ b/contract/test_snapshots/test/test_set_merchant_fee_recipient_contract_address_panics.1.json @@ -1042,4 +1042,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_metadata_label_at_limit_succeeds.1.json b/contract/test_snapshots/test/test_set_metadata_label_at_limit_succeeds.1.json index af4b519..3cb7197 100644 --- a/contract/test_snapshots/test/test_set_metadata_label_at_limit_succeeds.1.json +++ b/contract/test_snapshots/test/test_set_metadata_label_at_limit_succeeds.1.json @@ -1088,4 +1088,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_metadata_label_exceeding_limit_fails.1.json b/contract/test_snapshots/test/test_set_metadata_label_exceeding_limit_fails.1.json index 973f475..8e4ef44 100644 --- a/contract/test_snapshots/test/test_set_metadata_label_exceeding_limit_fails.1.json +++ b/contract/test_snapshots/test/test_set_metadata_label_exceeding_limit_fails.1.json @@ -1067,4 +1067,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_metadata_wrong_user_panics.1.json b/contract/test_snapshots/test/test_set_metadata_wrong_user_panics.1.json index 26e6150..9197029 100644 --- a/contract/test_snapshots/test/test_set_metadata_wrong_user_panics.1.json +++ b/contract/test_snapshots/test/test_set_metadata_wrong_user_panics.1.json @@ -1743,4 +1743,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_min_interval_admin_success.1.json b/contract/test_snapshots/test/test_set_min_interval_admin_success.1.json new file mode 100644 index 0000000..ccc288f --- /dev/null +++ b/contract/test_snapshots/test/test_set_min_interval_admin_success.1.json @@ -0,0 +1,1096 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_min_interval", + "args": [ + { + "u64": 7200 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "MinInterval" + } + ] + }, + "val": { + "u64": 7200 + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_min_interval" + } + ], + "data": { + "u64": 7200 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "min_interval_set" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "new" + }, + "val": { + "u64": 7200 + } + }, + { + "key": { + "symbol": "old" + }, + "val": { + "u64": 3600 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_min_interval" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "get_min_interval" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_min_interval" + } + ], + "data": { + "u64": 7200 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_min_interval_no_admin_panics.1.json b/contract/test_snapshots/test/test_set_min_interval_no_admin_panics.1.json new file mode 100644 index 0000000..d93892a --- /dev/null +++ b/contract/test_snapshots/test/test_set_min_interval_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_min_interval" + } + ], + "data": { + "u64": 7200 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + }, + { + "u64": 7200 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_min_interval" + }, + { + "vec": [ + { + "u64": 7200 + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_min_interval_non_admin_panics.1.json b/contract/test_snapshots/test/test_set_min_interval_non_admin_panics.1.json index 04600e6..a2f2df0 100644 --- a/contract/test_snapshots/test/test_set_min_interval_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_set_min_interval_non_admin_panics.1.json @@ -1027,4 +1027,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_min_interval_zero_panics.1.json b/contract/test_snapshots/test/test_set_min_interval_zero_panics.1.json index 4f327b9..ed3c5c5 100644 --- a/contract/test_snapshots/test/test_set_min_interval_zero_panics.1.json +++ b/contract/test_snapshots/test/test_set_min_interval_zero_panics.1.json @@ -81,7 +81,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [] ], "ledger": { @@ -278,6 +296,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { @@ -985,7 +1036,7 @@ "data": { "vec": [ { - "string": "caught panic 'min interval must be positive' from contract function 'Symbol(obj#235)'" + "string": "caught panic 'min interval must be positive' from contract function 'Symbol(obj#237)'" }, { "u64": 0 @@ -1087,4 +1138,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_amount_admin_succeeds.1.json b/contract/test_snapshots/test/test_set_subscription_amount_admin_succeeds.1.json index 5119f24..3b2e52d 100644 --- a/contract/test_snapshots/test/test_set_subscription_amount_admin_succeeds.1.json +++ b/contract/test_snapshots/test/test_set_subscription_amount_admin_succeeds.1.json @@ -2033,4 +2033,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_amount_no_subscription_panics.1.json b/contract/test_snapshots/test/test_set_subscription_amount_no_subscription_panics.1.json index f71478e..284fb01 100644 --- a/contract/test_snapshots/test/test_set_subscription_amount_no_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_amount_no_subscription_panics.1.json @@ -1086,4 +1086,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_amount_non_admin_panics.1.json b/contract/test_snapshots/test/test_set_subscription_amount_non_admin_panics.1.json index b751180..c8d5dfa 100644 --- a/contract/test_snapshots/test/test_set_subscription_amount_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_amount_non_admin_panics.1.json @@ -1791,4 +1791,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_interval_admin_succeeds.1.json b/contract/test_snapshots/test/test_set_subscription_interval_admin_succeeds.1.json index a1dbec1..458ea41 100644 --- a/contract/test_snapshots/test/test_set_subscription_interval_admin_succeeds.1.json +++ b/contract/test_snapshots/test/test_set_subscription_interval_admin_succeeds.1.json @@ -2071,4 +2071,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_interval_below_min_interval_panics.1.json b/contract/test_snapshots/test/test_set_subscription_interval_below_min_interval_panics.1.json index a81e51a..9820b7b 100644 --- a/contract/test_snapshots/test/test_set_subscription_interval_below_min_interval_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_interval_below_min_interval_panics.1.json @@ -1785,4 +1785,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_interval_no_subscription_panics.1.json b/contract/test_snapshots/test/test_set_subscription_interval_no_subscription_panics.1.json index d85117a..e0f572d 100644 --- a/contract/test_snapshots/test/test_set_subscription_interval_no_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_interval_no_subscription_panics.1.json @@ -1080,4 +1080,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_interval_non_admin_panics.1.json b/contract/test_snapshots/test/test_set_subscription_interval_non_admin_panics.1.json index 22001a8..c1bde2c 100644 --- a/contract/test_snapshots/test/test_set_subscription_interval_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_interval_non_admin_panics.1.json @@ -1785,4 +1785,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_subscription_interval_zero_panics.1.json b/contract/test_snapshots/test/test_set_subscription_interval_zero_panics.1.json index 73e755c..de03e79 100644 --- a/contract/test_snapshots/test/test_set_subscription_interval_zero_panics.1.json +++ b/contract/test_snapshots/test/test_set_subscription_interval_zero_panics.1.json @@ -1785,4 +1785,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_whitelist_enabled_admin_success.1.json b/contract/test_snapshots/test/test_set_whitelist_enabled_admin_success.1.json new file mode 100644 index 0000000..9fb192b --- /dev/null +++ b/contract/test_snapshots/test/test_set_whitelist_enabled_admin_success.1.json @@ -0,0 +1,1194 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_whitelist_enabled", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_whitelist_enabled", + "args": [ + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 6307200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 6307200 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_whitelist_enabled" + } + ], + "data": { + "bool": true + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_whitelist_enabled" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "is_whitelist_enabled" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "is_whitelist_enabled" + } + ], + "data": { + "bool": true + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_whitelist_enabled" + } + ], + "data": { + "bool": false + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_whitelist_enabled" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "is_whitelist_enabled" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "is_whitelist_enabled" + } + ], + "data": { + "bool": false + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_whitelist_enabled_false_allows_any_merchant.1.json b/contract/test_snapshots/test/test_set_whitelist_enabled_false_allows_any_merchant.1.json index 79f0a06..c05df5b 100644 --- a/contract/test_snapshots/test/test_set_whitelist_enabled_false_allows_any_merchant.1.json +++ b/contract/test_snapshots/test/test_set_whitelist_enabled_false_allows_any_merchant.1.json @@ -1940,4 +1940,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_set_whitelist_enabled_no_admin_panics.1.json b/contract/test_snapshots/test/test_set_whitelist_enabled_no_admin_panics.1.json new file mode 100644 index 0000000..9a721b3 --- /dev/null +++ b/contract/test_snapshots/test/test_set_whitelist_enabled_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "set_whitelist_enabled" + } + ], + "data": { + "bool": true + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#219)'" + }, + { + "bool": true + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "set_whitelist_enabled" + }, + { + "vec": [ + { + "bool": true + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_simulate_charge_variants.1.json b/contract/test_snapshots/test/test_simulate_charge_variants.1.json index 1ad6b0d..12d0a70 100644 --- a/contract/test_snapshots/test/test_simulate_charge_variants.1.json +++ b/contract/test_snapshots/test/test_simulate_charge_variants.1.json @@ -2683,4 +2683,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_after_set_min_interval_lower_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_after_set_min_interval_lower_succeeds.1.json index ed59dc3..fd34280 100644 --- a/contract/test_snapshots/test/test_subscribe_after_set_min_interval_lower_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_after_set_min_interval_lower_succeeds.1.json @@ -81,7 +81,25 @@ ] ], [], - [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_initial_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", @@ -802,7 +820,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 4270020994084947596 } }, "durability": "temporary" @@ -815,6 +833,39 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { "nonce": 2032731177588607455 @@ -1985,4 +2036,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_amount_above_cap_panics.1.json b/contract/test_snapshots/test/test_subscribe_amount_above_cap_panics.1.json index 0af866a..70ba623 100644 --- a/contract/test_snapshots/test/test_subscribe_amount_above_cap_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_amount_above_cap_panics.1.json @@ -1408,4 +1408,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_amount_at_cap_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_amount_at_cap_succeeds.1.json index ef07cf4..9f10230 100644 --- a/contract/test_snapshots/test/test_subscribe_amount_at_cap_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_amount_at_cap_succeeds.1.json @@ -2297,4 +2297,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_and_charge.1.json b/contract/test_snapshots/test/test_subscribe_and_charge.1.json index c7552bd..3e91b24 100644 --- a/contract/test_snapshots/test/test_subscribe_and_charge.1.json +++ b/contract/test_snapshots/test/test_subscribe_and_charge.1.json @@ -2509,4 +2509,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_contract_as_user_panics.1.json b/contract/test_snapshots/test/test_subscribe_contract_as_user_panics.1.json index dbbda0e..378258f 100644 --- a/contract/test_snapshots/test/test_subscribe_contract_as_user_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_contract_as_user_panics.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_exact_allowance_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_exact_allowance_succeeds.1.json index fd2dff3..b23aba4 100644 --- a/contract/test_snapshots/test/test_subscribe_exact_allowance_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_exact_allowance_succeeds.1.json @@ -1728,4 +1728,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_extends_instance_ttl.1.json b/contract/test_snapshots/test/test_subscribe_extends_instance_ttl.1.json index 57afdbc..f5df94e 100644 --- a/contract/test_snapshots/test/test_subscribe_extends_instance_ttl.1.json +++ b/contract/test_snapshots/test/test_subscribe_extends_instance_ttl.1.json @@ -1590,4 +1590,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_interval_minimum_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_interval_minimum_succeeds.1.json index e5ca779..6e34831 100644 --- a/contract/test_snapshots/test/test_subscribe_interval_minimum_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_interval_minimum_succeeds.1.json @@ -2010,4 +2010,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_interval_too_short_panics_default_floor.1.json b/contract/test_snapshots/test/test_subscribe_interval_too_short_panics_default_floor.1.json index 29e08ce..6532c32 100644 --- a/contract/test_snapshots/test/test_subscribe_interval_too_short_panics_default_floor.1.json +++ b/contract/test_snapshots/test/test_subscribe_interval_too_short_panics_default_floor.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_interval_under_60_panics.1.json b/contract/test_snapshots/test/test_subscribe_interval_under_60_panics.1.json index ebde009..62641c6 100644 --- a/contract/test_snapshots/test/test_subscribe_interval_under_60_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_interval_under_60_panics.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_interval_zero_panics.1.json b/contract/test_snapshots/test/test_subscribe_interval_zero_panics.1.json index 633822e..a42c9d3 100644 --- a/contract/test_snapshots/test/test_subscribe_interval_zero_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_interval_zero_panics.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_non_contract_address.1.json b/contract/test_snapshots/test/test_subscribe_non_contract_address.1.json index 60c45fc..003c05f 100644 --- a/contract/test_snapshots/test/test_subscribe_non_contract_address.1.json +++ b/contract/test_snapshots/test/test_subscribe_non_contract_address.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_non_whitelisted_merchant_panics.1.json b/contract/test_snapshots/test/test_subscribe_non_whitelisted_merchant_panics.1.json index 5e1c1ce..289746b 100644 --- a/contract/test_snapshots/test/test_subscribe_non_whitelisted_merchant_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_non_whitelisted_merchant_panics.1.json @@ -1207,4 +1207,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_overwrites_cancelled_subscription.1.json b/contract/test_snapshots/test/test_subscribe_overwrites_cancelled_subscription.1.json index 55a64d3..899b970 100644 --- a/contract/test_snapshots/test/test_subscribe_overwrites_cancelled_subscription.1.json +++ b/contract/test_snapshots/test/test_subscribe_overwrites_cancelled_subscription.1.json @@ -2345,4 +2345,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_self_subscription_panics.1.json b/contract/test_snapshots/test/test_subscribe_self_subscription_panics.1.json index c86025c..f2be633 100644 --- a/contract/test_snapshots/test/test_subscribe_self_subscription_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_self_subscription_panics.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_to_frozen_merchant_panics.1.json b/contract/test_snapshots/test/test_subscribe_to_frozen_merchant_panics.1.json index 554b96c..7d100cc 100644 --- a/contract/test_snapshots/test/test_subscribe_to_frozen_merchant_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_to_frozen_merchant_panics.1.json @@ -1408,4 +1408,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_valid_sac_token_address_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_valid_sac_token_address_succeeds.1.json index 1a76c6d..5cf5694 100644 --- a/contract/test_snapshots/test/test_subscribe_valid_sac_token_address_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_valid_sac_token_address_succeeds.1.json @@ -1729,4 +1729,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_whitelisted_merchant_succeeds.1.json b/contract/test_snapshots/test/test_subscribe_whitelisted_merchant_succeeds.1.json index df7e30c..9db7ada 100644 --- a/contract/test_snapshots/test/test_subscribe_whitelisted_merchant_succeeds.1.json +++ b/contract/test_snapshots/test/test_subscribe_whitelisted_merchant_succeeds.1.json @@ -2140,4 +2140,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_with_metadata_label_too_long.1.json b/contract/test_snapshots/test/test_subscribe_with_metadata_label_too_long.1.json index e8f9f34..1af136f 100644 --- a/contract/test_snapshots/test/test_subscribe_with_metadata_label_too_long.1.json +++ b/contract/test_snapshots/test/test_subscribe_with_metadata_label_too_long.1.json @@ -1101,4 +1101,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_with_metadata_no_subscription_on_label_failure.1.json b/contract/test_snapshots/test/test_subscribe_with_metadata_no_subscription_on_label_failure.1.json index e8f9f34..1af136f 100644 --- a/contract/test_snapshots/test/test_subscribe_with_metadata_no_subscription_on_label_failure.1.json +++ b/contract/test_snapshots/test/test_subscribe_with_metadata_no_subscription_on_label_failure.1.json @@ -1101,4 +1101,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_with_metadata_success.1.json b/contract/test_snapshots/test/test_subscribe_with_metadata_success.1.json index 7c41415..9bc527e 100644 --- a/contract/test_snapshots/test/test_subscribe_with_metadata_success.1.json +++ b/contract/test_snapshots/test/test_subscribe_with_metadata_success.1.json @@ -1830,4 +1830,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_zero_allowance_does_not_write_storage.1.json b/contract/test_snapshots/test/test_subscribe_zero_allowance_does_not_write_storage.1.json index 857a43f..b19f5b1 100644 --- a/contract/test_snapshots/test/test_subscribe_zero_allowance_does_not_write_storage.1.json +++ b/contract/test_snapshots/test/test_subscribe_zero_allowance_does_not_write_storage.1.json @@ -446,4 +446,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscribe_zero_allowance_panics.1.json b/contract/test_snapshots/test/test_subscribe_zero_allowance_panics.1.json index be4ac14..72ce1c4 100644 --- a/contract/test_snapshots/test/test_subscribe_zero_allowance_panics.1.json +++ b/contract/test_snapshots/test/test_subscribe_zero_allowance_panics.1.json @@ -889,4 +889,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscriber_index_three_unique_users.1.json b/contract/test_snapshots/test/test_subscriber_index_three_unique_users.1.json index 7236507..52ed89a 100644 --- a/contract/test_snapshots/test/test_subscriber_index_three_unique_users.1.json +++ b/contract/test_snapshots/test/test_subscriber_index_three_unique_users.1.json @@ -3634,4 +3634,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscriber_page_offset_beyond_count_returns_empty.1.json b/contract/test_snapshots/test/test_subscriber_page_offset_beyond_count_returns_empty.1.json index f3bd1e0..a1c237e 100644 --- a/contract/test_snapshots/test/test_subscriber_page_offset_beyond_count_returns_empty.1.json +++ b/contract/test_snapshots/test/test_subscriber_page_offset_beyond_count_returns_empty.1.json @@ -1751,4 +1751,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_age_after_subscribe.1.json b/contract/test_snapshots/test/test_subscription_age_after_subscribe.1.json index cb6f695..a8c7e3f 100644 --- a/contract/test_snapshots/test/test_subscription_age_after_subscribe.1.json +++ b/contract/test_snapshots/test/test_subscription_age_after_subscribe.1.json @@ -1639,4 +1639,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_age_none_for_migrated_sentinel.1.json b/contract/test_snapshots/test/test_subscription_age_none_for_migrated_sentinel.1.json index 3dbba5b..15b9ce9 100644 --- a/contract/test_snapshots/test/test_subscription_age_none_for_migrated_sentinel.1.json +++ b/contract/test_snapshots/test/test_subscription_age_none_for_migrated_sentinel.1.json @@ -1638,4 +1638,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_age_none_when_no_subscription.1.json b/contract/test_snapshots/test/test_subscription_age_none_when_no_subscription.1.json index b8df933..7822f2f 100644 --- a/contract/test_snapshots/test/test_subscription_age_none_when_no_subscription.1.json +++ b/contract/test_snapshots/test/test_subscription_age_none_when_no_subscription.1.json @@ -932,4 +932,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_age_resets_on_resubscribe.1.json b/contract/test_snapshots/test/test_subscription_age_resets_on_resubscribe.1.json index 9428b0c..98896ba 100644 --- a/contract/test_snapshots/test/test_subscription_age_resets_on_resubscribe.1.json +++ b/contract/test_snapshots/test/test_subscription_age_resets_on_resubscribe.1.json @@ -2115,4 +2115,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_amount_validation_exceeds_max.1.json b/contract/test_snapshots/test/test_subscription_amount_validation_exceeds_max.1.json index c4f741b..e669bd5 100644 --- a/contract/test_snapshots/test/test_subscription_amount_validation_exceeds_max.1.json +++ b/contract/test_snapshots/test/test_subscription_amount_validation_exceeds_max.1.json @@ -1911,4 +1911,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_amount_validation_zero.1.json b/contract/test_snapshots/test/test_subscription_amount_validation_zero.1.json index 122d8a0..ca57f2a 100644 --- a/contract/test_snapshots/test/test_subscription_amount_validation_zero.1.json +++ b/contract/test_snapshots/test/test_subscription_amount_validation_zero.1.json @@ -1911,4 +1911,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_active_healthy.1.json b/contract/test_snapshots/test/test_subscription_health_active_healthy.1.json index 289f13a..21be3bb 100644 --- a/contract/test_snapshots/test/test_subscription_health_active_healthy.1.json +++ b/contract/test_snapshots/test/test_subscription_health_active_healthy.1.json @@ -1755,4 +1755,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_daily_limit_set.1.json b/contract/test_snapshots/test/test_subscription_health_daily_limit_set.1.json index 119e08a..3d04ba9 100644 --- a/contract/test_snapshots/test/test_subscription_health_daily_limit_set.1.json +++ b/contract/test_snapshots/test/test_subscription_health_daily_limit_set.1.json @@ -1944,4 +1944,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_grace_period.1.json b/contract/test_snapshots/test/test_subscription_health_grace_period.1.json index 1171704..c9fbd5b 100644 --- a/contract/test_snapshots/test/test_subscription_health_grace_period.1.json +++ b/contract/test_snapshots/test/test_subscription_health_grace_period.1.json @@ -2012,4 +2012,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_insufficient_allowance.1.json b/contract/test_snapshots/test/test_subscription_health_insufficient_allowance.1.json index bf0f049..234489a 100644 --- a/contract/test_snapshots/test/test_subscription_health_insufficient_allowance.1.json +++ b/contract/test_snapshots/test/test_subscription_health_insufficient_allowance.1.json @@ -1921,4 +1921,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_non_existent_user.1.json b/contract/test_snapshots/test/test_subscription_health_non_existent_user.1.json index eaa11cf..d542d5a 100644 --- a/contract/test_snapshots/test/test_subscription_health_non_existent_user.1.json +++ b/contract/test_snapshots/test/test_subscription_health_non_existent_user.1.json @@ -991,4 +991,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_paused.1.json b/contract/test_snapshots/test/test_subscription_health_paused.1.json index 675ddc8..5452703 100644 --- a/contract/test_snapshots/test/test_subscription_health_paused.1.json +++ b/contract/test_snapshots/test/test_subscription_health_paused.1.json @@ -1920,4 +1920,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_health_trial_active.1.json b/contract/test_snapshots/test/test_subscription_health_trial_active.1.json index 9fb5542..4d81418 100644 --- a/contract/test_snapshots/test/test_subscription_health_trial_active.1.json +++ b/contract/test_snapshots/test/test_subscription_health_trial_active.1.json @@ -1759,4 +1759,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_subscription_struct_fields_match_input.1.json b/contract/test_snapshots/test/test_subscription_struct_fields_match_input.1.json index 8eb8689..d36ada9 100644 --- a/contract/test_snapshots/test/test_subscription_struct_fields_match_input.1.json +++ b/contract/test_snapshots/test/test_subscription_struct_fields_match_input.1.json @@ -1729,4 +1729,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_top_merchants_by_subs.1.json b/contract/test_snapshots/test/test_top_merchants_by_subs.1.json index 0283b1d..8505107 100644 --- a/contract/test_snapshots/test/test_top_merchants_by_subs.1.json +++ b/contract/test_snapshots/test/test_top_merchants_by_subs.1.json @@ -7982,4 +7982,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_top_merchants_limit_exceeded_panics.1.json b/contract/test_snapshots/test/test_top_merchants_limit_exceeded_panics.1.json index 6923b72..1b0b107 100644 --- a/contract/test_snapshots/test/test_top_merchants_limit_exceeded_panics.1.json +++ b/contract/test_snapshots/test/test_top_merchants_limit_exceeded_panics.1.json @@ -1057,4 +1057,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_top_merchants_tie_breaking_and_limit.1.json b/contract/test_snapshots/test/test_top_merchants_tie_breaking_and_limit.1.json index a530001..4e10826 100644 --- a/contract/test_snapshots/test/test_top_merchants_tie_breaking_and_limit.1.json +++ b/contract/test_snapshots/test/test_top_merchants_tie_breaking_and_limit.1.json @@ -3778,4 +3778,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_admin.1.json b/contract/test_snapshots/test/test_transfer_admin.1.json index c00d48d..9471650 100644 --- a/contract/test_snapshots/test/test_transfer_admin.1.json +++ b/contract/test_snapshots/test/test_transfer_admin.1.json @@ -1117,4 +1117,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_admin_event_emitted.1.json b/contract/test_snapshots/test/test_transfer_admin_event_emitted.1.json index 33865e8..988eb01 100644 --- a/contract/test_snapshots/test/test_transfer_admin_event_emitted.1.json +++ b/contract/test_snapshots/test/test_transfer_admin_event_emitted.1.json @@ -1116,4 +1116,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_admin_requires_auth.1.json b/contract/test_snapshots/test/test_transfer_admin_requires_auth.1.json index c00d48d..9471650 100644 --- a/contract/test_snapshots/test/test_transfer_admin_requires_auth.1.json +++ b/contract/test_snapshots/test/test_transfer_admin_requires_auth.1.json @@ -1117,4 +1117,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_subscription_event_emitted.1.json b/contract/test_snapshots/test/test_transfer_subscription_event_emitted.1.json index 7ca2f9d..561bb27 100644 --- a/contract/test_snapshots/test/test_transfer_subscription_event_emitted.1.json +++ b/contract/test_snapshots/test/test_transfer_subscription_event_emitted.1.json @@ -2391,4 +2391,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_subscription_self_transfer_panics.1.json b/contract/test_snapshots/test/test_transfer_subscription_self_transfer_panics.1.json index 77cb1d5..7a2dfe1 100644 --- a/contract/test_snapshots/test/test_transfer_subscription_self_transfer_panics.1.json +++ b/contract/test_snapshots/test/test_transfer_subscription_self_transfer_panics.1.json @@ -1772,4 +1772,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_subscription_succeeds.1.json b/contract/test_snapshots/test/test_transfer_subscription_succeeds.1.json index 8a1d311..f701171 100644 --- a/contract/test_snapshots/test/test_transfer_subscription_succeeds.1.json +++ b/contract/test_snapshots/test/test_transfer_subscription_succeeds.1.json @@ -2775,4 +2775,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_subscription_to_active_user_panics.1.json b/contract/test_snapshots/test/test_transfer_subscription_to_active_user_panics.1.json index 937069b..ff7bccc 100644 --- a/contract/test_snapshots/test/test_transfer_subscription_to_active_user_panics.1.json +++ b/contract/test_snapshots/test/test_transfer_subscription_to_active_user_panics.1.json @@ -2737,4 +2737,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_transfer_subscription_to_contract_address_panics.1.json b/contract/test_snapshots/test/test_transfer_subscription_to_contract_address_panics.1.json index a139e90..735a419 100644 --- a/contract/test_snapshots/test/test_transfer_subscription_to_contract_address_panics.1.json +++ b/contract/test_snapshots/test/test_transfer_subscription_to_contract_address_panics.1.json @@ -1772,4 +1772,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_ttl_extension.1.json b/contract/test_snapshots/test/test_ttl_extension.1.json index df9f5dc..6a230ca 100644 --- a/contract/test_snapshots/test/test_ttl_extension.1.json +++ b/contract/test_snapshots/test/test_ttl_extension.1.json @@ -1778,4 +1778,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_unfreeze_merchant_non_admin_panics.1.json b/contract/test_snapshots/test/test_unfreeze_merchant_non_admin_panics.1.json index 09d17b9..adcaaa7 100644 --- a/contract/test_snapshots/test/test_unfreeze_merchant_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_unfreeze_merchant_non_admin_panics.1.json @@ -1027,4 +1027,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_unfreeze_merchant_non_frozen_is_noop.1.json b/contract/test_snapshots/test/test_unfreeze_merchant_non_frozen_is_noop.1.json index 07d17e0..82f10ee 100644 --- a/contract/test_snapshots/test/test_unfreeze_merchant_non_frozen_is_noop.1.json +++ b/contract/test_snapshots/test/test_unfreeze_merchant_non_frozen_is_noop.1.json @@ -1067,4 +1067,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_upgrade_event_emitted.1.json b/contract/test_snapshots/test/test_upgrade_event_emitted.1.json index c0afb89..02f3d30 100644 --- a/contract/test_snapshots/test/test_upgrade_event_emitted.1.json +++ b/contract/test_snapshots/test/test_upgrade_event_emitted.1.json @@ -3,7 +3,9 @@ "address": 1, "nonce": 0 }, - "auth": [[]], + "auth": [ + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -89,4 +91,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_upgrade_event_emitted.2.json b/contract/test_snapshots/test/test_upgrade_event_emitted.2.json index 1bbeaa7..30f80a2 100644 --- a/contract/test_snapshots/test/test_upgrade_event_emitted.2.json +++ b/contract/test_snapshots/test/test_upgrade_event_emitted.2.json @@ -1083,4 +1083,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_user_can_switch_token.1.json b/contract/test_snapshots/test/test_user_can_switch_token.1.json index 09c645c..60fef25 100644 --- a/contract/test_snapshots/test/test_user_can_switch_token.1.json +++ b/contract/test_snapshots/test/test_user_can_switch_token.1.json @@ -2781,4 +2781,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_validate_recipient_address_contract_self_panics.1.json b/contract/test_snapshots/test/test_validate_recipient_address_contract_self_panics.1.json index 1f25c49..731bd49 100644 --- a/contract/test_snapshots/test/test_validate_recipient_address_contract_self_panics.1.json +++ b/contract/test_snapshots/test/test_validate_recipient_address_contract_self_panics.1.json @@ -1080,4 +1080,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_validate_recipient_address_valid_passes.1.json b/contract/test_snapshots/test/test_validate_recipient_address_valid_passes.1.json index 4f54d47..d837f5d 100644 --- a/contract/test_snapshots/test/test_validate_recipient_address_valid_passes.1.json +++ b/contract/test_snapshots/test/test_validate_recipient_address_valid_passes.1.json @@ -1232,4 +1232,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_admin_success.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_admin_success.1.json new file mode 100644 index 0000000..9785f20 --- /dev/null +++ b/contract/test_snapshots/test/test_whitelist_batch_add_admin_success.1.json @@ -0,0 +1,1496 @@ +{ + "generators": { + "address": 9, + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "whitelist_batch_add", + "args": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndex" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantKnown" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantWhitelist" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantWhitelist" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantWhitelist" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MerchantWhitelist" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndex" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndex" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndex" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndexSize" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "WhitelistIndexSize" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + 1555200 + ] + ], + [ + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "whitelist_batch_add" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "merchant_added" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "merchant_added" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "whitelist_batch_add" + } + ], + "data": { + "u32": 2 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_duplicates_does_not_panic.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_duplicates_does_not_panic.1.json index 8b09d32..18d371f 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_add_duplicates_does_not_panic.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_add_duplicates_does_not_panic.1.json @@ -1341,4 +1341,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_exceeds_max_size_panics.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_exceeds_max_size_panics.1.json index 4b4a778..5ab165a 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_add_exceeds_max_size_panics.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_add_exceeds_max_size_panics.1.json @@ -1378,4 +1378,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_no_admin_panics.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_no_admin_panics.1.json new file mode 100644 index 0000000..9b83354 --- /dev/null +++ b/contract/test_snapshots/test/test_whitelist_batch_add_no_admin_panics.1.json @@ -0,0 +1,1005 @@ +{ + "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": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": 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": "WhitelistEnabled" + } + ] + }, + "val": { + "bool": false + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Allowance" + }, + { + "map": [ + { + "key": { + "symbol": "from" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "spender" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + ] + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + }, + { + "key": { + "symbol": "live_until_ledger" + }, + "val": { + "u32": 200000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 200001 + ] + ], + [ + { + "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": 100000000000 + } + } + }, + { + "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" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000000000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "approve" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 100000000000 + } + }, + { + "u32": 200000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" + }, + { + "symbol": "whitelist_batch_add" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'admin not set' from contract function 'Symbol(obj#221)'" + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "whitelist_batch_add" + }, + { + "vec": [ + { + "vec": [] + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_non_admin_panics.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_non_admin_panics.1.json index 4e86649..3659a56 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_add_non_admin_panics.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_add_non_admin_panics.1.json @@ -1078,4 +1078,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_over_configured_cap_panics.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_over_configured_cap_panics.1.json index 4bbc7df..abb9f0d 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_add_over_configured_cap_panics.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_add_over_configured_cap_panics.1.json @@ -1201,4 +1201,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_add_three_merchants.1.json b/contract/test_snapshots/test/test_whitelist_batch_add_three_merchants.1.json index 1b1e4cc..8aea556 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_add_three_merchants.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_add_three_merchants.1.json @@ -1849,4 +1849,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_remove_non_whitelisted_is_noop.1.json b/contract/test_snapshots/test/test_whitelist_batch_remove_non_whitelisted_is_noop.1.json index 784e6ff..6cc5297 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_remove_non_whitelisted_is_noop.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_remove_non_whitelisted_is_noop.1.json @@ -1056,4 +1056,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_remove_over_configured_cap_panics.1.json b/contract/test_snapshots/test/test_whitelist_batch_remove_over_configured_cap_panics.1.json index e721a9b..82f6776 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_remove_over_configured_cap_panics.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_remove_over_configured_cap_panics.1.json @@ -1201,4 +1201,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_batch_remove_two_merchants.1.json b/contract/test_snapshots/test/test_whitelist_batch_remove_two_merchants.1.json index 8eb1718..867362a 100644 --- a/contract/test_snapshots/test/test_whitelist_batch_remove_two_merchants.1.json +++ b/contract/test_snapshots/test/test_whitelist_batch_remove_two_merchants.1.json @@ -1652,4 +1652,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_whitelist_index_size_page_and_swap_remove.1.json b/contract/test_snapshots/test/test_whitelist_index_size_page_and_swap_remove.1.json index d7dccf0..280fc9e 100644 --- a/contract/test_snapshots/test/test_whitelist_index_size_page_and_swap_remove.1.json +++ b/contract/test_snapshots/test/test_whitelist_index_size_page_and_swap_remove.1.json @@ -2544,4 +2544,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_withdraw_merchant_revenue_succeeds.1.json b/contract/test_snapshots/test/test_withdraw_merchant_revenue_succeeds.1.json index 6be4577..534eb66 100644 --- a/contract/test_snapshots/test/test_withdraw_merchant_revenue_succeeds.1.json +++ b/contract/test_snapshots/test/test_withdraw_merchant_revenue_succeeds.1.json @@ -3012,4 +3012,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_withdraw_merchant_revenue_zero_balance_panics.1.json b/contract/test_snapshots/test/test_withdraw_merchant_revenue_zero_balance_panics.1.json index 46d80ba..df4c9e4 100644 --- a/contract/test_snapshots/test/test_withdraw_merchant_revenue_zero_balance_panics.1.json +++ b/contract/test_snapshots/test/test_withdraw_merchant_revenue_zero_balance_panics.1.json @@ -1191,4 +1191,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_zero_amount.1.json b/contract/test_snapshots/test/test_zero_amount.1.json index 97e6fed..86819f9 100644 --- a/contract/test_snapshots/test/test_zero_amount.1.json +++ b/contract/test_snapshots/test/test_zero_amount.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/contract/test_snapshots/test/test_zero_interval.1.json b/contract/test_snapshots/test/test_zero_interval.1.json index ebde009..62641c6 100644 --- a/contract/test_snapshots/test/test_zero_interval.1.json +++ b/contract/test_snapshots/test/test_zero_interval.1.json @@ -1095,4 +1095,4 @@ "failed_call": false } ] -} +} \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 6f56672..f6f2939 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -12,8 +12,6 @@ import { useAdmin } from "./hooks/useAdmin"; import { useContractId } from "./hooks/useContractId"; import { useContractPaused } from "./hooks/useContractPaused"; import { useToast } from "./hooks/useToast"; -import SubscribeForm from "./components/SubscribeForm"; -import Dashboard from "./components/Dashboard"; import MerchantDashboard from "./components/MerchantDashboard"; import WalletSelectModal from "./components/WalletSelectModal"; import WalletBar from "./components/WalletBar"; @@ -22,7 +20,6 @@ import OfflineBanner from "./components/OfflineBanner"; import ContractPauseBanner from "./components/ContractPauseBanner"; import NetworkBadge from "./components/NetworkBadge"; import AdminDashboard from "./pages/AdminDashboard"; -import ContractPauseBanner from "./components/ContractPauseBanner"; import type { WalletAdapter } from "./services/wallets/WalletAdapter"; type Tab = "dashboard" | "subscribe" | "merchant" | "admin"; @@ -32,7 +29,7 @@ export default function App() { useWallet(); const { announcement, announce } = useAccessibility(); const { healthy, circuitOpen } = useRpcHealthContext(); - const [tab, setTab] = useState<"subscribe" | "dashboard">("dashboard"); + const [tab, setTab] = useState("dashboard"); const [refresh, setRefresh] = useState(0); const [showRpcSettings, setShowRpcSettings] = useState(false); @@ -43,6 +40,8 @@ export default function App() { const { isAdmin } = useAdmin(publicKey); const { networkMatch, walletNetwork, isMainnet, requiresMainnetConfirm, confirmMainnet } = useNetworkCheck(); + const { valid: isContractIdValid, error: contractIdError } = useContractId(); + const isOnline = useNetworkStatus(); const { isAdmin } = useAdmin(publicKey); const { isPaused } = useContractPaused(); // Dashboard/SubscribeForm/MerchantDashboard/admin panels each keep their own @@ -51,8 +50,6 @@ export default function App() { // scope here. This App-level instance exists solely to drive the header's // NotificationCenter (issue #864). const { notifications, unreadCount, markAllRead, clearNotifications } = useToast(); - const [tab, setTab] = useState("dashboard"); - const [refresh, setRefresh] = useState(0); const [showWalletModal, setShowWalletModal] = useState(false); const wasOnline = useRef(isOnline); @@ -123,6 +120,17 @@ export default function App() { {/* Actionable gate warning banner */} {gateError && ( +
+

+ ⚠ Configuration/Network Gate Warning: {gateError} +

+
+ )} + {/* Contract pause banner — shown at root level so it's always visible */} {/* RPC Failure Banner */} @@ -154,6 +162,10 @@ export default function App() { style={{ fontSize: 12, padding: "4px 8px", whiteSpace: "nowrap" }} > Try a different endpoint + + + )} + {/* Mainnet safety gate — require explicit confirmation once per session when passphrase is mainnet */} {isMainnet && requiresMainnetConfirm && (
{ }); // Import the implementation AFTER the mock block is securely established -import { fetchEvents, getChargeHistory, server, getServer } from "../stellar"; import { + fetchEvents, + getChargeHistory, + server, + getServer, chargeSimBlocksPay, chargeSimIsRisky, decodeChargeSimResult, - fetchEvents, - getChargeHistory, isSubscriptionHealthy, normalizeSubscriptionHealth, payBlockedReason, payWarningReason, - server, subscriptionHasWarnings, subscriptionHealthBlocksPay, } from "../stellar"; @@ -597,6 +597,9 @@ describe("getServer — URL resolution", () => { }; const s = getServer(); expect(s).toBe(server); + }); +}); + describe("subscription health helpers", () => { const healthy = { active: true, diff --git a/frontend/src/components/ConfirmModal.tsx b/frontend/src/components/ConfirmModal.tsx index e728c6f..23c29e6 100644 --- a/frontend/src/components/ConfirmModal.tsx +++ b/frontend/src/components/ConfirmModal.tsx @@ -42,6 +42,7 @@ export default function ConfirmModal({ +